commit 7ca0a21283b891aa03b689a48abdcd8c960a241f Author: hiperman Date: Thu Dec 4 00:33:37 2025 -0500 Initial commit diff --git a/.env.prod-example b/.env.prod-example new file mode 100644 index 0000000..e6b6b40 --- /dev/null +++ b/.env.prod-example @@ -0,0 +1,16 @@ +# Change this secret to something random +CHITAI_TOKEN_SECRET=secret + +# Setup the path to your initial library (optional) +CHITAI_DEFAULT_LIBRARY_NAME=Books +CHITAI_DEFAULT_LIBRARY_PATH="libraries/books" + +# You probably should not change these +CHITAI_API_URL="http://backend:8000" +CHITAI_API_DEBUG=false +CHITAI_POSTGRES_HOST=db +CHITAI_POSTGRES_DB=chitai +CHITAI_POSTGRES_USER=chitai_user +CHITAI_POSTGRES_PASSWORD=chitai_password +CHITAI_POSTGRES_PORT=5432 +CHITAI_POSTGRES_ECHO=false diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2bce16d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Mark pdfjs as vendored code +frontend/static/pdfjs/** linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e36d596 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.env +.postgres/ +.venv \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a08c3c6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,232 @@ +GNU GENERAL PUBLIC LICENSE +Version 3, 29 June 2007 + +Copyright © 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. + + chitai + Copyright (C) 2025 hiperman + + 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: + + chitai Copyright (C) 2025 hiperman + 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/README.md b/README.md new file mode 100644 index 0000000..42bf729 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# Chitai - eBook Library Management + +eBook library management application. + +- Backend built with Python and Litestar +- Frontend built with Svelte 5 and SvelteKit + +Library Home Page + +## Key Features + +* **Libraries:** Organize your eBooks into customizable libraries. +* **Book Upload:** Easily upload eBook files in common formats, with automatic metadata extraction. +* **Personalized Bookshelves:** Create and manage custom bookshelves (lists) within your libraries to categorize your eBooks. +* **Built-in Readers:** Integrated readers for EPUB and PDF files. +* **Progress Tracking:** Monitor your reading progress within each book. +* **Search Functionality:** Quickly find books based on title. + +## Getting Started + +### Prerequisites + +* Docker +* Docker Compose +* (Optional) A text editor for modifying the `.env` file. + +### Installation (Production Deployment) + +1. Clone the repository: `git clone ` (Replace `` with the actual URL) +2. Navigate to the project root: `cd chitai` +3. Build the Docker images: `docker compose build` +4. Copy the example environment file and configure: `cp .env.prod-example .env` +5. Run the Docker containers in detached mode: `docker compose up -d` +6. Access the frontend at: `http://localhost:3000/` + +## Development + +### NixOS Development Environment + +To utilize the NixOS development environment: + +1. Navigate to the project root in your terminal: `cd chitai` +2. Enter the Nix shell: `nix-shell` + +Docker development containers are planned for a future release. diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..b501c1a --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,20 @@ +# Version control +.git/ +.gitignore +.gitattributes + +# Python +**/__pycache__/ + +# Docker +Dockerfile* +docker-compose*.yml +.dockerignore + +# Development +.env.local +.env.development +*.log + +# Formatting and linting +**/.ruff_cache diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..fae9b69 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,15 @@ +# Python-generated files +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# Virtual environments +.venv + +# Project specific directories/files +covers/ +books/ +.postgres/ diff --git a/backend/.python-version b/backend/.python-version new file mode 100644 index 0000000..24ee5b1 --- /dev/null +++ b/backend/.python-version @@ -0,0 +1 @@ +3.13 diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..46339cd --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,57 @@ +# An example using multi-stage image builds to create a final image without uv. + +# First, build the application in the `/app` directory. +# See `Dockerfile` for details. +FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim AS builder +ENV UV_COMPILE_BYTECODE=1 \ + UV_LINK_MODE=copy + +# Disable Python downloads, because we want to use the system interpreter +# across both images. If using a managed Python version, it needs to be +# copied from the build image into the final image; see `standalone.Dockerfile` +# for an example. +ENV UV_PYTHON_DOWNLOADS=0 + +WORKDIR /app +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --locked --no-install-project --no-dev + + +COPY uv.lock pyproject.toml README.md /app/ +COPY src /app +COPY migrations ./migrations +COPY entrypoint.sh alembic.ini /app/ +RUN chmod +x /app/entrypoint.sh +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --locked --no-dev --no-editable + + +FROM python:3.13-slim-bookworm + +# Setup a non-root user +RUN groupadd -g 1000 appuser && \ + useradd -u 1000 -g appuser -m -d /app -s /sbin/nologin appuser + +RUN apt-get update && apt-get install -y \ + gosu \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Copy the application from the builder +COPY --from=builder --chown=appuser:appuser /app /app + +# Place executables in the environment at the front of the path +ENV PATH="/app/.venv/bin:$PATH" + +HEALTHCHECK --interval=10s --timeout=3s --retries=5 \ + CMD curl -f http://localhost:8000/healthcheck || exit 1 + +# Use `/app` as the working directory +WORKDIR /app + +ENTRYPOINT [ "/app/entrypoint.sh" ] + +# Run the web application +CMD ["litestar", "--app-dir", "chitai", "run", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..b85c416 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,127 @@ +# Chitai API + +A RESTful API for managing ebooks, built with [Litestar](https://litestar.dev/) and Python. + +## Overview + +This backend service provides a comprehensive API for ebook management, including: +- Ebook catalog management (CRUD operations) +- Virtual libraries and user bookshelves +- Metadata management (authors, publishers, tags, identifiers) +- File storage and retrieval +- Search and filtering capabilities +- Reading progress tracking +- User library management + +**Tech Stack:** +- Python 3.13 +- Litestar (ASGI web framework) +- Advanced-alchemy/SQLAlchemy (ORM) +- PostgreSQL (database) +- Alembic (migrations) + +## Prerequisites + +- Python 3.13 +- PostgreSQL 17 +- uv + +## Getting Started + +### 1. Install Dependencies + +Using uv (recommended): +```bash +uv sync +``` + +### 2. Environment Configuration + +Copy the example environment file and configure environment variables: +```bash +cp .env.example .env +``` + +### 3. Database Setup + +Run migrations: +```bash +alchemy --config chitai.database.config.config upgrade +``` + +### 4. Run the Application + +Development mode with auto-reload: +```bash +uv run litestar --app-dir src/chitai/ run --reload +``` + +The API will be available at `http://localhost:8000` + +## Development + +### Project Structure + +``` +backend/ +├── src/ +| └── chitai +| | ├── app.py # Litestar app initialization +| | ├── config.py # Configuration settings +| | ├── controllers # API route handlers +| | ├── database +| | │ ├── models # SQLAlchemy models +| | ├── exceptions # Custom exceptions and handlers +| | ├── schemas # Pydantic schemas (DTOs) +| | └── services # Business logic layer +├── migrations/ # Alembic migrations +├── tests/ +│ ├── unit/ +│ ├── integration/ +│ └── conftest.py +├── alembic.ini +├── pyproject.toml +└── README.md +``` + +### Running Tests + +Run all tests: +```bash +pytest tests/ +``` + +Run specific test categories: +```bash +# Unit tests only +pytest tests/unit + +# Integration tests only +pytest tests/integration +``` + +### Code Quality + +Format code: +```bash +ruff format src/ +``` + +### Creating Database Migrations + +After modifying models: +```bash +alchemy --config chitai.database.config.config make-migrations +``` + +For manual migrations: +```bash +alchemy --config chitai.database.config.config make-migrations --no-autogenerate +``` + +## API Documentation + +Once the server is running, interactive API documentation is available at: + +- **Swagger UI**: http://localhost:8000/schema/ +- **OpenAPI JSON**: http://localhost:8000/schema/openapi.json \ No newline at end of file diff --git a/backend/alembic.ini b/backend/alembic.ini new file mode 100644 index 0000000..6152bc6 --- /dev/null +++ b/backend/alembic.ini @@ -0,0 +1,73 @@ +# Advanced Alchemy Alembic Asyncio Config + +[alembic] +prepend_sys_path = src:. +# path to migration scripts +script_location = migrations + +# template used to generate migration files +file_template = %%(year)d-%%(month).2d-%%(day).2d_%%(slug)s_%%(rev)s + +# This is not required to be set when running through `advanced_alchemy` +# sqlalchemy.url = driver://user:pass@localhost/dbname + +# timezone to use when rendering the date +# within the migration file as well as the filename. +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = UTC + +# max length of characters to apply to the +# "slug" field +truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat alembic/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +output_encoding = utf-8 + +# [post_write_hooks] +# This section defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, +# against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh new file mode 100755 index 0000000..87569cb --- /dev/null +++ b/backend/entrypoint.sh @@ -0,0 +1,39 @@ +#!/bin/sh + +set -e + + +PUID=${PUID:-1000} +PGID=${PGID:-1000} + +echo "Starting with UID=$PUID, GID=$PGID" + +WRITABLE_DIRS="/app/covers /app/libraries" + +# Modify user PGID and PUID to match ther user on the host +if [ "$PUID" != "1000" ] || [ "$PGID" != "1000" ]; then + echo "Adjusting user to UID=$PUID, GID=$PGID" + groupmod -o -g "$PGID" appuser + usermod -o -u "$PUID" appuser + + + # Update permissions on writable directories + for dir in $WRITABLE_DIRS; do + if [ -d "$dir" ]; then + echo "Fixing permissions for $dir" + chown -R appuser:appuser "$dir" + chmod -R 755 "$dir" + else + echo "Creating $dir" + mkdir -p "$dir" + chown -R appuser:appuser "$dir" + chmod -R 755 "$dir" + fi + done +fi + +echo "Running database migrations..." +alchemy --config chitai.database.config.config upgrade --no-prompt + +echo "Starting application..." +exec gosu appuser "$@" diff --git a/backend/migrations/__init__.py b/backend/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/env.py b/backend/migrations/env.py new file mode 100644 index 0000000..7552373 --- /dev/null +++ b/backend/migrations/env.py @@ -0,0 +1,107 @@ +import asyncio +from typing import TYPE_CHECKING, cast + +from sqlalchemy import pool +from sqlalchemy.ext.asyncio import AsyncEngine, async_engine_from_config + +from advanced_alchemy.base import metadata_registry +from alembic import context +from alembic.autogenerate import rewriter + +if TYPE_CHECKING: + from sqlalchemy.engine import Connection + + from advanced_alchemy.alembic.commands import AlembicCommandConfig + +__all__ = ("do_run_migrations", "run_migrations_offline", "run_migrations_online") + + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config: "AlembicCommandConfig" = context.config # type: ignore +writer = rewriter.Rewriter() + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + """ + context.configure( + url=config.db_url, + target_metadata=metadata_registry.get(config.bind_key), + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + compare_type=config.compare_type, + version_table=config.version_table_name, + version_table_pk=config.version_table_pk, + user_module_prefix=config.user_module_prefix, + render_as_batch=config.render_as_batch, + process_revision_directives=writer, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def do_run_migrations(connection: "Connection") -> None: + """Run migrations.""" + context.configure( + connection=connection, + target_metadata=metadata_registry.get(config.bind_key), + compare_type=config.compare_type, + version_table=config.version_table_name, + version_table_pk=config.version_table_pk, + user_module_prefix=config.user_module_prefix, + render_as_batch=config.render_as_batch, + process_revision_directives=writer, + ) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine and associate a + connection with the context. + + Raises: + RuntimeError: If the engine cannot be created from the config. + """ + configuration = config.get_section(config.config_ini_section) or {} + configuration["sqlalchemy.url"] = config.db_url + + connectable = cast( + "AsyncEngine", + config.engine + or async_engine_from_config( + configuration, + prefix="sqlalchemy.", + poolclass=pool.NullPool, + future=True, + ), + ) + if connectable is None: # pyright: ignore[reportUnnecessaryComparison] + msg = "Could not get engine from config. Please ensure your `alembic.ini` according to the official Alembic documentation." + raise RuntimeError( + msg, + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + await connectable.dispose() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + asyncio.run(run_migrations_online()) diff --git a/backend/migrations/script.py.mako b/backend/migrations/script.py.mako new file mode 100644 index 0000000..204e859 --- /dev/null +++ b/backend/migrations/script.py.mako @@ -0,0 +1,72 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" + +import warnings +from typing import TYPE_CHECKING + +import sqlalchemy as sa +from alembic import op +from advanced_alchemy.types import EncryptedString, EncryptedText, GUID, ORA_JSONB, DateTimeUTC, StoredObject, PasswordHash, FernetBackend +from advanced_alchemy.types.encrypted_string import PGCryptoBackend +from advanced_alchemy.types.password_hash.argon2 import Argon2Hasher +from advanced_alchemy.types.password_hash.passlib import PasslibHasher +from advanced_alchemy.types.password_hash.pwdlib import PwdlibHasher +from sqlalchemy import Text # noqa: F401 +${imports if imports else ""} +if TYPE_CHECKING: + from collections.abc import Sequence + +__all__ = ["downgrade", "upgrade", "schema_upgrades", "schema_downgrades", "data_upgrades", "data_downgrades"] + +sa.GUID = GUID +sa.DateTimeUTC = DateTimeUTC +sa.ORA_JSONB = ORA_JSONB +sa.EncryptedString = EncryptedString +sa.EncryptedText = EncryptedText +sa.StoredObject = StoredObject +sa.PasswordHash = PasswordHash +sa.Argon2Hasher = Argon2Hasher +sa.PasslibHasher = PasslibHasher +sa.PwdlibHasher = PwdlibHasher +sa.FernetBackend = FernetBackend +sa.PGCryptoBackend = PGCryptoBackend + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + with op.get_context().autocommit_block(): + schema_upgrades() + data_upgrades() + +def downgrade() -> None: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + with op.get_context().autocommit_block(): + data_downgrades() + schema_downgrades() + +def schema_upgrades() -> None: + """schema upgrade migrations go here.""" + ${upgrades if upgrades else "pass"} + +def schema_downgrades() -> None: + """schema downgrade migrations go here.""" + ${downgrades if downgrades else "pass"} + +def data_upgrades() -> None: + """Add any optional data upgrade migrations here!""" + +def data_downgrades() -> None: + """Add any optional data downgrade migrations here!""" \ No newline at end of file diff --git a/backend/migrations/versions/2025-10-31_add_pg_trgm_extension_26022ec86f32.py b/backend/migrations/versions/2025-10-31_add_pg_trgm_extension_26022ec86f32.py new file mode 100644 index 0000000..c0c39a6 --- /dev/null +++ b/backend/migrations/versions/2025-10-31_add_pg_trgm_extension_26022ec86f32.py @@ -0,0 +1,65 @@ +"""Add pg_trgm extension + +Revision ID: 26022ec86f32 +Revises: +Create Date: 2025-10-31 18:45:55.027462 + +""" + +import warnings +from typing import TYPE_CHECKING + +import sqlalchemy as sa +from alembic import op +from advanced_alchemy.types import EncryptedString, EncryptedText, GUID, ORA_JSONB, DateTimeUTC, StoredObject, PasswordHash +from sqlalchemy import Text # noqa: F401 + +if TYPE_CHECKING: + from collections.abc import Sequence + +__all__ = ["downgrade", "upgrade", "schema_upgrades", "schema_downgrades", "data_upgrades", "data_downgrades"] + +sa.GUID = GUID +sa.DateTimeUTC = DateTimeUTC +sa.ORA_JSONB = ORA_JSONB +sa.EncryptedString = EncryptedString +sa.EncryptedText = EncryptedText +sa.StoredObject = StoredObject +sa.PasswordHash = PasswordHash + +# revision identifiers, used by Alembic. +revision = '26022ec86f32' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.execute(sa.text('create EXTENSION if not EXISTS "pgcrypto"')) + op.execute(sa.text('create EXTENSION if not EXISTS "pg_trgm"')) + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + with op.get_context().autocommit_block(): + schema_upgrades() + data_upgrades() + +def downgrade() -> None: + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=UserWarning) + with op.get_context().autocommit_block(): + data_downgrades() + schema_downgrades() + +def schema_upgrades() -> None: + """schema upgrade migrations go here.""" + pass + +def schema_downgrades() -> None: + """schema downgrade migrations go here.""" + pass + +def data_upgrades() -> None: + """Add any optional data upgrade migrations here!""" + +def data_downgrades() -> None: + """Add any optional data downgrade migrations here!""" diff --git a/backend/migrations/versions/__init__.py b/backend/migrations/versions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/pyproject.toml b/backend/pyproject.toml new file mode 100644 index 0000000..c89e469 --- /dev/null +++ b/backend/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "chitai" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +authors = [ + { name = "patrykj", email = "patrykjaroszewski@proton.me" } +] +requires-python = ">=3.13" +dependencies = [ + "advanced-alchemy==1.8.0", + "aiofiles>=24.1.0", + "asyncpg>=0.30.0", + "ebooklib>=0.19", + "jinja2>=3.1.6", + "litestar[jwt,standard]>=2.16.0", + "passlib>=1.7.4", + "pillow>=11.2.1", + "pwdlib[argon2]>=0.2.1", + "pydantic>=2.11.5", + "pydantic-settings>=2.9.1", + "pypdfium2>=4.30.0", + "watchfiles>=1.1.1", + "xmltodict>=1.0.2", +] + +[project.scripts] +chitai = "chitai:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[dependency-groups] +dev = [ + "pytest>=8.4.2", + "pytest-asyncio>=1.2.0", + "pytest-databases[postgres]>=0.15.0", +] + +[tool.pytest.ini_options] +asyncio_mode = "auto" +testpaths = ["tests"] diff --git a/backend/shell.nix b/backend/shell.nix new file mode 100644 index 0000000..6237424 --- /dev/null +++ b/backend/shell.nix @@ -0,0 +1,91 @@ +{ pkgs ? import {}}: + +pkgs.mkShell { + buildInputs = with pkgs; [ + # Python development environment for Chitai + python313Full + python313Packages.greenlet + python313Packages.ruff + uv + + # postgres database + postgresql + + ]; + + shellHook = '' + # Only cd if we're not already in backend + if [[ $(basename $(pwd)) != "backend" ]]; then + cd backend + fi + BACKEND_PATH=$(pwd) + + echo "Initializing Python development environment with uv" + + # Create a virtual environment if it doesn't exist + if [ ! -d ".venv" ]; then + echo "Creating virtual environment..." + uv venv .venv + fi + + # Activate the virtual environment + source .venv/bin/activate + + echo "Python environment ready!" + echo "Python version: $(python --version)" + echo "uv version: $(uv --version)" + echo "Virtual environment activated at: $VIRTUAL_ENV" + + # Install required packages + uv sync + echo "Successfully installed packages!" + + echo "Setting up the postgres database" + export PGHOST=$BACKEND_PATH/.postgres + export PGDATA=$PGHOST/data + export PGDATABASE=chitai + export PGUSERNAME=chitai_user + export PGPASSWORD="chitai_password" + export PGLOG=$PGHOST/postgres.log + export LD_LIBRARY_PATH="${pkgs.postgresql.lib}/lib:$LD_LIBRARY_PATH" + + mkdir -p $PGHOST + + # Initialize the postgres database if not present + if [ ! -d "$PGDATA" ]; then + echo "Initializing PostgreSQL..." + initdb -D $BACKEND_PATH/.postgres/data \ + -U $PGUSERNAME \ + --pwfile=<(echo "$PGPASSWORD") \ + --auth=md5 \ + --encoding=UTF-8 + fi + + if ! pg_ctl status > /dev/null 2>&1 + then + echo "Starting PostgreSQL..." + pg_ctl start -l $PGLOG -o "--unix_socket_directories='$PGHOST'" + fi + + echo "PostgreSQL is running!" + + if ! psql -h $PGHOST -d postgres -lqt 2>/dev/null | cut -d \| -f 1 | grep -qw chitai; then + echo "Creating database chitai..." + createdb -U $PGUSERNAME -h $PGHOST chitai + fi + + # Run database migrations + uv run alchemy --config chitai.database.config.config upgrade --no-prompt + + # Return to root directory + cd - + ''; + + exitHook = '' + BACKEND_PATH=$(pwd)/backend + cd $BACKEND_PATH + echo "Stopping PostgreSQL..." + pg_ctl stop + cd - + ''; +} diff --git a/backend/src/chitai/__init__.py b/backend/src/chitai/__init__.py new file mode 100644 index 0000000..4bc6f78 --- /dev/null +++ b/backend/src/chitai/__init__.py @@ -0,0 +1,2 @@ +def main() -> None: + print("Hello from chitai!") diff --git a/backend/src/chitai/app.py b/backend/src/chitai/app.py new file mode 100644 index 0000000..d82b0c7 --- /dev/null +++ b/backend/src/chitai/app.py @@ -0,0 +1,136 @@ +import asyncio +from typing import Any + +from chitai.services.book import BookService +from chitai.services.consume import ConsumeDirectoryWatcher +from litestar import Litestar, get +from litestar.openapi.config import OpenAPIConfig +from litestar.openapi.plugins import SwaggerRenderPlugin +from litestar.di import Provide +from litestar.security.jwt import OAuth2PasswordBearerAuth, Token +from litestar.connection import ASGIConnection +from litestar.static_files import create_static_files_router +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession + + +from chitai import controllers as c +from chitai.config import settings +from chitai.database.config import alchemy +from chitai.database.models.user import User +from chitai.schemas.library import LibraryCreate +from chitai.services.dependencies import provide_user, provide_user_service +from chitai.services.library import LibraryService +from chitai.services.utils import create_directory +from chitai.exceptions.handlers import exception_handlers + + +@get("/") +async def index() -> str: + return "Hello from Chitai!" + + +@get("/healthcheck") +async def healthcheck(db_session: AsyncSession) -> dict[str, str]: + await db_session.execute(text("SELECT 1")) + return {"status": "OK"} + + +async def retrieve_user_handler( + token: Token, connection: ASGIConnection[Any, Any, Any, Any] +) -> User | None: + service = await anext( + provide_user_service( + settings.alchemy_config.provide_session( + connection.app.state, connection.scope + ) + ) + ) + return await service.get_one_or_none(email=token.sub) + + +oauth2_auth = OAuth2PasswordBearerAuth[User]( + retrieve_user_handler=retrieve_user_handler, + token_secret=settings.token_secret, + # we are specifying the URL for retrieving a JWT access token + token_url="/access/login", + # we are specifying which endpoints should be excluded from authentication. In this case the login endpoint + # and our openAPI docs. + exclude=[ + "/healthcheck", + "/access/login", + "/access/login/token", + "/access/signup", + "/opds", + "/schema", + ], +) + +watcher_task: asyncio.Task + +async def startup(): + """Run setup.""" + + # Setup databse + async with settings.alchemy_config.get_session() as db_session: + # Create default library if none exist + library_service = LibraryService(session=db_session) + _, total = await library_service.list_and_count() + + if total == 0: + await library_service.create( + LibraryCreate( + name=settings.default_library_name, + root_path=settings.default_library_path, + ) + ) + await db_session.commit() + + # book_service = BookService(session=db_session) + + # Create book covers directory if it does not exist + await create_directory(settings.book_cover_path) + + # Create consume directory + await create_directory(settings.consume_path) + + + # file_watcher = ConsumeDirectoryWatcher(settings.consume_path, library_service, book_service) + # watcher_task = asyncio.create_task(file_watcher.init_watcher()) + +async def shutdown(): + """ Run shutdown tasks. """ + + watcher_task.cancel() + +def create_app() -> Litestar: + return Litestar( + route_handlers=[ + c.BookController, + c.LibraryController, + c.AccessController, + c.BookshelfController, + c.AuthorController, + c.PublisherController, + c.TagController, + c.OpdsController, + create_static_files_router(path="/covers", directories=["./covers"]), + index, + healthcheck, + ], + exception_handlers=exception_handlers, + on_startup=[startup], + plugins=[alchemy], + on_app_init=[oauth2_auth.on_app_init], + openapi_config=OpenAPIConfig( + title="Chitai", + description="Chitai API docs", + version="0.0.1", + render_plugins=[SwaggerRenderPlugin()], + ), + dependencies={"current_user": Provide(provide_user, sync_to_thread=False)}, + debug=settings.api_debug, + ) + + +app = create_app() diff --git a/backend/src/chitai/config.py b/backend/src/chitai/config.py new file mode 100644 index 0000000..69d6723 --- /dev/null +++ b/backend/src/chitai/config.py @@ -0,0 +1,55 @@ +from pydantic import Field, PostgresDsn, computed_field +from pydantic_settings import BaseSettings, SettingsConfigDict +from advanced_alchemy.extensions.litestar import ( + SQLAlchemyAsyncConfig, +) + +class Settings(BaseSettings): + version: str = Field("0.0.1") + project_name: str = Field("chitai") + + # Database settings + postgres_db: str = Field("chitai") + postgres_user: str = Field("chitai_user") + postgres_password: str = Field("chitai_password") + postgres_host: str = Field("localhost") + postgres_port: str = Field("5432") + postgres_echo: bool = Field(False) + postgres_scheme: str = "postgresql+asyncpg" + + # Debug settings + api_debug: bool = Field(False) + + # JWT token secret + token_secret: str = Field("secret") + + # Defaut library + default_library_name: str = Field("Books") + default_library_path: str = Field("./books") + + # Path to book covers + book_cover_path: str = Field("./covers") + + # Path to consume directory + consume_path: str = Field("./consume") + + @computed_field + @property + def postgres_uri(self) -> PostgresDsn: + return PostgresDsn( + f"{self.postgres_scheme}://{self.postgres_user}:{self.postgres_password}" + f"@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}" + ) + + model_config = SettingsConfigDict( + env_prefix="chitai_", env_file=".env", validate_default=False, extra="ignore" + ) + + @property + def alchemy_config(self) -> SQLAlchemyAsyncConfig: + from chitai.database.config import config + + return config + + +settings = Settings() # type: ignore diff --git a/backend/src/chitai/controllers/__init__.py b/backend/src/chitai/controllers/__init__.py new file mode 100644 index 0000000..b694cd1 --- /dev/null +++ b/backend/src/chitai/controllers/__init__.py @@ -0,0 +1,8 @@ +from .book import BookController +from .library import LibraryController +from .access import AccessController +from .shelf import BookshelfController +from .author import AuthorController +from .tag import TagController +from .publisher import PublisherController +from .opds import OpdsController diff --git a/backend/src/chitai/controllers/access.py b/backend/src/chitai/controllers/access.py new file mode 100644 index 0000000..b95d67a --- /dev/null +++ b/backend/src/chitai/controllers/access.py @@ -0,0 +1,116 @@ +# src/chitai/controllers/access.py + +# Standard library +from typing import Annotated, Any +import logging + +# Third-party libraries +from litestar.security.jwt import OAuth2Login +from litestar import Controller, Response, get, post +from litestar.params import Body +from litestar.enums import RequestEncodingType +from litestar.status_codes import HTTP_409_CONFLICT, HTTP_401_UNAUTHORIZED +from litestar.exceptions import HTTPException, PermissionDeniedException +from advanced_alchemy.extensions.litestar.providers import create_service_dependencies +from advanced_alchemy.exceptions import DuplicateKeyError + +# Local imports +from chitai.services.user import UserService +from chitai.schemas.user import UserCreate, UserLogin, UserRead +from chitai.database.models.user import User + +logger = logging.getLogger(__name__) + + +class AccessController(Controller): + """Controller for user authentication and access management.""" + + path = "/access" + dependencies = create_service_dependencies(UserService, key="users_service") + + @post("/signup") + async def register(self, data: UserCreate, users_service: UserService) -> UserRead: + """ + Register a new user account. + + Creates a new user with the provided credentials. Email addresses must be unique. + + Request Body: + data: User registration data including email and password. + + Injected Dependencies: + users_service: The user service for database operations. + + Returns: + The created user account as a UserRead schema. + + Raises: + HTTPException (409): If a user with the provided email already exists. + """ + try: + user = await users_service.create(data) + return users_service.to_schema(user, schema_type=UserRead) + + except DuplicateKeyError: + raise HTTPException( + status_code=HTTP_409_CONFLICT, + detail="A user with this email already exists", + ) + + @post("/login") + async def login( + self, + data: Annotated[ + UserLogin, + Body(title="OAuth2 Login", media_type=RequestEncodingType.URL_ENCODED), + ], + users_service: UserService, + ) -> Response[OAuth2Login]: + """ + Authenticate a user and generate an OAuth2 token. + + Verifies the provided credentials and returns an authentication token + for subsequent authenticated requests. + + Request Body: + data: Login credentials (email and password). + + Injected Dependencies: + users_service: The user service for authentication. + + Returns: + OAuth2 token and login information. + + Raises: + HTTPException (401): If credentials are invalid or user not found. + """ + + try: + user = await users_service.authenticate(data.email, data.password) + except PermissionDeniedException: + raise HTTPException( + status_code=HTTP_401_UNAUTHORIZED, detail="Invalid email or password" + ) + + from chitai.app import oauth2_auth + + return oauth2_auth.login( + identifier=data.email, + token_extras={"user_id": user.id, "email": user.email}, + ) + + @get("/me") + async def get_user_info(self, current_user: User) -> UserRead: + """ + Retrieve the currently authenticated user's information. + + Returns the profile information of the user making the request. + + Injected Dependencies: + current_user: The authenticated user from the OAuth2 token. + + Returns: + The current user's information as a UserRead schema. + """ + + return UserRead(**current_user.to_dict()) diff --git a/backend/src/chitai/controllers/author.py b/backend/src/chitai/controllers/author.py new file mode 100644 index 0000000..3a16690 --- /dev/null +++ b/backend/src/chitai/controllers/author.py @@ -0,0 +1,68 @@ +# src/chitai/controllers/author.py + +# Standard library +from typing import Annotated + +# Third-party libraries +from litestar import Controller, post, get, patch, delete +from litestar.params import Dependency +from litestar.exceptions import HTTPException +from advanced_alchemy.extensions.litestar.providers import create_service_dependencies +from advanced_alchemy.service.pagination import OffsetPagination +from advanced_alchemy.service import FilterTypeT + +# Local imports +from chitai.services import AuthorService +from chitai.schemas import AuthorRead +from chitai.services.filters.author import AuthorLibraryFilter + + +class AuthorController(Controller): + """Controller for managing author information.""" + + path = "/authors" + dependencies = create_service_dependencies( + AuthorService, + key="author_service", + filters={ + "id_filter": int, + "pagination_type": "limit_offset", + "sort_field": "name", + "search": ["name"], + "search_ignore_case": True, + }, + ) + + @get() + async def list_authors( + self, + author_service: AuthorService, + libraries: list[int] | None = None, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + ) -> OffsetPagination[AuthorRead]: + """ + List authors with filtering, pagination, and search. + + Supports searching by name and filtering by library. Results can be sorted + and paginated using standard query parameters. + + Query Parameters: + library_id: Optional library ID to filter authors. If None, returns all authors. + id_filter: Filter by author ID (from create_filter_dependencies). + sort_field: Field to sort by (default: 'name'). + search: Search term for author name field. + search_ignore_case: Case-insensitive search (default: True). + limit: Number of results per page (pagination). + offset: Number of results to skip (pagination). + + Injected Dependencies: + author_service: The author service for database operations. + filters: Pre-constructed filters from dependencies. + + Returns: + Paginated list of authors matching the criteria. + """ + filters.append(AuthorLibraryFilter(libraries)) + + authors, total = await author_service.list_and_count(*filters, uniquify=True) + return author_service.to_schema(authors, total, filters, schema_type=AuthorRead) diff --git a/backend/src/chitai/controllers/book.py b/backend/src/chitai/controllers/book.py new file mode 100644 index 0000000..46839cb --- /dev/null +++ b/backend/src/chitai/controllers/book.py @@ -0,0 +1,454 @@ +# src/chitai/controllers/book.py + +# TODO: Make the endpoints more consistent (i.e sometimes book_id is a path parameter, other times it a query param) + +# Standard library +from typing import Annotated + +# Third-party libraries +from litestar import Controller, get, post, put, patch, delete +from litestar.di import Provide +from litestar.params import Dependency, Body +from litestar.enums import RequestEncodingType +from litestar.response import File, Stream +from litestar.exceptions import HTTPException +from litestar.status_codes import HTTP_400_BAD_REQUEST +from litestar.datastructures import UploadFile +from advanced_alchemy.service.pagination import OffsetPagination +from advanced_alchemy.filters import CollectionFilter +from advanced_alchemy.service import FilterTypeT + +# Local imports +from chitai.services import dependencies as deps +from chitai import schemas as s +from chitai.database import models as m +from chitai.services import BookService, BookProgressService + + +class BookController(Controller): + """Controller for managing book-related operations.""" + + path = "/books" + dependencies = { + "books_service": Provide(deps.provide_book_service), + "progress_service": Provide(deps.provide_progress_service), + "library_service": Provide(deps.provide_library_service), + "library": Provide(deps.get_library_by_id), + "authors_filter": Provide(deps.provide_authors_filter, sync_to_thread=False), + "publishers_filter": Provide( + deps.provide_publishers_filter, sync_to_thread=False + ), + "tags_filter": Provide(deps.provide_tags_filter, sync_to_thread=False), + "bookshelves_filter": Provide( + deps.provide_bookshelves_filter, sync_to_thread=False + ), + "progress_filter": Provide(deps.provide_progress_filter, sync_to_thread=False), + "libraries_filter": Provide( + deps.provide_libraries_filter, sync_to_thread=False + ), + "book_filters": Provide(deps.provide_book_filters, sync_to_thread=False), + } | deps.create_book_filter_dependencies( + { + "id_filter": int, + "pagination_type": "limit_offset", + "sort_field": "title", + "search": ["title"], + "search_ignore_case": True, + } + ) + + @post(request_max_body_size=None) + async def create_book( + self, + books_service: BookService, + library: m.Library, + data: Annotated[s.BookCreate, Body(media_type=RequestEncodingType.MULTI_PART)], + ) -> s.BookRead: + """ + Create a new book with metadata and files. + + Accepts book metadata and associated files, processes them through the + book service, and returns the created book details. + + Path Parameters: + library_id: The ID of the library the book belongs to. + + Request Body: + data: Book creation data including metadata and files. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library the book belongs to. + + Returns: + The created book as a BookRead schema. + + """ + + result = await books_service.create(data, library) + book = await books_service.get(result.id) + return books_service.to_schema(book, schema_type=s.BookRead) + + @post("fromFiles", request_max_body_size=None) + async def create_books_without_metadata( + self, + books_service: BookService, + library: m.Library, + data: Annotated[ + s.BooksCreateFromFiles, Body(media_type=RequestEncodingType.MULTI_PART) + ], + ) -> OffsetPagination[s.BookRead]: + """ + Create multiple books from uploaded files. + + Groups files by directory and creates separate books for each group. + Metadata is automatically extracted from the files. + + Request Body: + data: Container with list of uploaded files. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library the books belong to. + + Returns: + Paginated list of created books. + """ + try: + results = await books_service.create_many_from_files(data, library) + except ValueError: + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, detail="Must upload at least one file" + ) + + books = await books_service.list( + CollectionFilter("id", [result.id for result in results]) + ) + return books_service.to_schema(books, schema_type=s.BookRead) + + @get(path="/{book_id:int}") + async def get_book_by_id( + self, book_id: int, books_service: BookService, current_user: m.User + ) -> s.BookRead: + """ + Retrieve book details by ID. + + Path Parameters: + book_id: The ID of the book to retrieve. + + Injected Dependencies: + books_service: The book service for database operations. + current_user: The authenticated user making the request. + + Returns: + The book details as a BookRead schema. + """ + book = await books_service.get(book_id) + return books_service.to_schema(book, schema_type=s.BookRead) + + @get() + async def list_books( + self, + books_service: BookService, + book_filters: Annotated[ + list[FilterTypeT], Dependency(skip_validation=True) + ] = [], + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + ) -> OffsetPagination[s.BookRead]: + """ + List books with filtering, pagination, and search. + + Supports filtering by library, tags, authors, shelves, and publishers. + + Query Parameters: + library_id: The library to list books from. + tags: Optional list of tag IDs to filter by. + authors: Optional list of author IDs to filter by. + shelves: Optional list of bookshelf IDs to filter by. + publishers: Optional list of publisher IDs to filter by. + id: Injected filter. Filter by book ID. + sort_field: Injected filter. Field to sort by (default: title). + search: Injected filter. Search on title field. + search_ignore_case: Injected filter. Case-insensitive search. + + Injected Dependencies: + books_service: The book service for database operations. + current_user: The authenticated user making the request. + filters: Pre-constructed filters from dependencies. + + Returns: + Paginated list of books matching the criteria. + """ + + books, total = await books_service.list_and_count(*filters, *book_filters) + return books_service.to_schema(books, total, filters, schema_type=s.BookRead) + + @patch(path="{book_id:int}") + async def update_book_metadata( + self, + book_id: int, + data: Annotated[ + s.BookMetadataUpdate, Body(media_type=RequestEncodingType.JSON) + ], + books_service: BookService, + library: m.Library, + ) -> s.BookRead: + """ + Update a book's metadata and optionally reorganize files if necessary. + + Allows editing book metadata such as title, author, and series information. + If metadata changes affect the file organization path, files are + automatically reorganized. + + Path Parameters: + book_id: The ID of the book to update. + + Request Body: + data: Updated metadata for the book. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library containing the book. + + Returns: + The updated book as a BookRead schema. + """ + await books_service.update(book_id, data, library) + book = await books_service.get(book_id) + return books_service.to_schema(book, schema_type=s.BookRead) + + @put(path="{book_id:int}/cover") + async def update_cover( + self, + book_id: int, + data: Annotated[UploadFile, Body(media_type=RequestEncodingType.MULTI_PART)], + books_service: BookService, + library: m.Library, + ) -> s.BookRead: + """ + Update's a book's cover image. + + Allows uploading a new cover image that replaces the current cover. + + Path Parameters: + book_id: The ID of the book to update. + + Request Body: + cover_image: The new cover image for the book. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library containing the book. + + Returns: + The updated book as a BookRead schema. + """ + + await books_service.update(book_id, {"cover_image": data}, library) + updated_book = await books_service.get(book_id) + return books_service.to_schema(updated_book, schema_type=s.BookRead) + + @get(path="download/{book_id:int}/{file_id:int}") + async def get_file( + self, book_id: int, file_id: int, books_service: BookService + ) -> File: + """ + Download a single file from a book. + + Path Parameters: + book_id: The ID of the book containing the file. + file_id: The ID of the file to download. + + Injected Dependencies: + books_service: The book service for database operations. + + Returns: + The file ready for download. + """ + return await books_service.get_file(book_id, file_id) + + @get(path="download") + async def get_files( + self, book_ids: list[int], library_id: int, books_service: BookService + ) -> Stream: + """ + Download multiple books as a single ZIP file. + + Compresses all files from specified books into a single archive for download. + + Query Parameters: + book_ids: List of book IDs to include in the download. + library_id: The library containing the books. + + Injected Dependencies: + books_service: The book service for database operations. + + Returns: + A stream of the compressed ZIP file. + """ + return Stream( + books_service.get_files(book_ids, library_id), + headers={ + "Content-Disposition": 'attachment; filename="download.zip"', + "Content-Type": "application/zip", + }, + ) + + @post(path="/{book_id:int}/files", request_max_body_size=None) + async def add_book_files( + self, + book_id: int, + data: Annotated[ + list[UploadFile], Body(media_type=RequestEncodingType.MULTI_PART) + ], + library: m.Library, + books_service: BookService, + ) -> s.BookRead: + """ + Add files to an existing book. + + Path Parameters: + book_id: The ID of the book to modify + + Request Body: + files: The files to add to the book + + Injected Dependencies: + library: The library containing the book. + books_service: The book service for database operations. + + Returns: + The modified book + + """ + + await books_service.add_files(book_id, data, library) + book = await books_service.get(book_id) + return books_service.to_schema(book, schema_type=s.BookRead) + + @delete(path="{book_id:int}/files") + async def delete_book_files( + self, + library: m.Library, + books_service: BookService, + book_id: int, + file_ids: list[int], + delete_files: bool = False, + ) -> None: + """ + Delete specific files from a book. + + Removes the specified files from both the database and optionally + remove them from the filesystem. + + Path Parameters: + book_id: The ID of the book. + + Query Parameters: + file_ids: List of file IDs to delete. + delete_files: If True, also delete files from the filesystem. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library containing the book. + """ + + if len(file_ids) == 0: + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, + detail="At least one file to delete is required", + ) + + await books_service.remove_files(book_id, file_ids, delete_files, library) + + @delete(path="/") + async def delete_books( + self, + books_service: BookService, + library: m.Library, + book_ids: list[int], + delete_files: bool = False, + ) -> None: + """ + Delete multiple books by ID. + + Removes books from the database and optionally deletes associated files + from the filesystem. + + Query Parameters: + book_ids: List of book IDs to delete. + delete_files: If True, also delete associated files from the filesystem. + library_id: The library the given books belong to. + + Injected Dependencies: + books_service: The book service for database operations. + library: The library containing the books. + + """ + + await books_service.delete(book_ids, library, delete_files=delete_files) + + @post(path="/progress/{book_id:int}") + async def update_progress( + self, + book_id: int, + current_user: m.User, + data: s.BookProgressCreate, + progress_service: BookProgressService, + ) -> None: + """ + Update or create reading progress for a book. + + Records the user's progress on a book, creating or updating the progress entry. + + Path Parameters: + book_id: The ID of the book. + + Request Body: + data: Progress data to update. + + Injected Dependencies: + current_user: The authenticated user. + progress_service: The progress service for database operations. + + """ + progress = await progress_service.get_one_or_none( + m.BookProgress.user_id == current_user.id, m.BookProgress.book_id == book_id + ) + dict_data = data.model_dump() | {"user_id": current_user.id, "book_id": book_id} + await progress_service.upsert(dict_data, progress.id if progress else None) + + @post(path="progress") + async def set_book_progress_batch( + self, + book_ids: list[int], + data: Annotated[s.BookProgressCreate, Body()], + current_user: m.User, + progress_service: BookProgressService, + ) -> None: + """ + Marks all the user progress on the books matching the IDs as completed. + + Query Parameters: + book_ids: List of book IDs to mark as completed. + + Injected Dependencies: + current_user: The authenticated user. + progress_service: The progress service for database operations. + """ + + # TODO Optimize this by performing a batch query and batch upsert + for book_id in book_ids: + existing_progress = await progress_service.get_one_or_none( + m.BookProgress.user_id == current_user.id, + m.BookProgress.book_id == book_id, + ) + + progress_data = data.model_dump() | { + "user_id": current_user.id, + "book_id": book_id, + } + + await progress_service.upsert( + progress_data, existing_progress.id if existing_progress else None + ) diff --git a/backend/src/chitai/controllers/library.py b/backend/src/chitai/controllers/library.py new file mode 100644 index 0000000..c8dfdfa --- /dev/null +++ b/backend/src/chitai/controllers/library.py @@ -0,0 +1,76 @@ +# src/chitai/controllers/library.py + +# Standard library +from typing import Annotated + +# Third-party libraries +from litestar import Controller, post, get, patch, delete +from litestar.params import Dependency +from litestar.exceptions import HTTPException +from advanced_alchemy.extensions.litestar.providers import create_service_dependencies +from advanced_alchemy.service.pagination import OffsetPagination +from advanced_alchemy.service import FilterTypeT + +# Local imports +from chitai.database import models as m +from chitai.services import LibraryService +from chitai.schemas.library import LibraryCreate, LibraryRead +from chitai.services.utils import DirectoryDoesNotExist + + +class LibraryController(Controller): + """Controller for managing library operations.""" + + path = "/libraries" + dependencies = create_service_dependencies( + LibraryService, + key="library_service", + filters={"id_filter": int, "pagination_type": "limit_offset"}, + ) + + @post() + async def create_library( + self, library_service: LibraryService, data: LibraryCreate + ) -> LibraryRead: + """ + Create a new library. + + Creates a new library entry in the system using the provided data. If the library is read-only + the target root path must exist. + + Request Body: + data: Data used to create the new library. + + Injected Dependencies: + library_service: The service used to manage library creation and persistence. + + Returns: + The created library. + """ + try: + library = await library_service.create(data) + return library_service.to_schema(library, schema_type=LibraryRead) + except DirectoryDoesNotExist as exc: + raise HTTPException(status_code=400, detail=str(exc)) + + @get() + async def list_libraries( + self, + library_service: LibraryService, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)], + ) -> OffsetPagination[LibraryRead]: + """ + List all libraries. + + Retrieves a paginated list of all libraries, optionally filtered by parameters. + + Query Parameters: + filters: Filtering by ID and pagination parameters. + + Injected Dependencies: + library_service: The service used to query and return library data. + """ + results, total = await library_service.list_and_count(*filters, load=[m.Library.books]) + return library_service.to_schema( + results, total, filters, schema_type=LibraryRead + ) diff --git a/backend/src/chitai/controllers/opds.py b/backend/src/chitai/controllers/opds.py new file mode 100644 index 0000000..cb37efa --- /dev/null +++ b/backend/src/chitai/controllers/opds.py @@ -0,0 +1,298 @@ + +from chitai.services import dependencies as deps +from chitai.database import models as m +from chitai.services.author import AuthorService +from chitai.services.filters.author import AuthorLibraryFilter +from chitai.services.filters.publisher import PublisherLibraryFilter +from chitai.services.filters.tags import TagLibraryFilter +from chitai.services.opds.models import Entry, Link, LinkTypes, LinkRelations +from chitai.services.opds.opds import create_acquisition_feed, create_navigation_feed, create_library_navigation_feed, create_collection_navigation_feed, create_pagination_links, create_search_link, get_opensearch_document +from chitai.services import BookService, ShelfService, LibraryService +from chitai.services.publisher import PublisherService +from chitai.services.tag import TagService +from litestar import Controller, Request, Response, get +from litestar.response import File +from litestar.di import Provide +from litestar.exceptions import HTTPException +from advanced_alchemy.filters import CollectionFilter, LimitOffset, OrderBy +from chitai.middleware.basic_auth import basic_auth_mw +from urllib.parse import urlencode +from typing import Annotated +from litestar.params import Dependency +from advanced_alchemy.service import FilterTypeT + + + +class OpdsController(Controller): + """ Controller for managing OPDS endpoints """ + + middleware=[basic_auth_mw] + + dependencies = { + "user": Provide(deps.provide_user_via_basic_auth), + "library_service": Provide(deps.provide_library_service), + "library": Provide(deps.get_library_by_id), + "books_service": Provide(deps.provide_book_service), + "shelf_service": Provide(deps.provide_shelf_service), + "tag_service": Provide(deps.provide_tag_service), + "author_service": Provide(deps.provide_author_service), + "publisher_service": Provide(deps.provide_publisher_service), + "authors_filter": Provide(deps.provide_authors_filter, sync_to_thread=False), + "publishers_filter": Provide( + deps.provide_publishers_filter, sync_to_thread=False + ), + "tags_filter": Provide(deps.provide_tags_filter, sync_to_thread=False), + "bookshelves_filter": Provide( + deps.provide_bookshelves_filter, sync_to_thread=False + ), + "progress_filter": Provide(deps.provide_progress_filter, sync_to_thread=False), + "libraries_filter": Provide( + deps.provide_libraries_filter, sync_to_thread=False + ), + "book_filters": Provide(deps.provide_book_filters, sync_to_thread=False), + } | deps.create_book_filter_dependencies( + { + "id_filter": int, + "pagination_type": "limit_offset", + "sort_field": "title", + "search": ["title"], + "search_ignore_case": True, + } + ) + + path = "/opds" + + @get() + async def get_root_feed(self, library_service: LibraryService) -> Response: + + libraries = await library_service.list() + + entries = [ + Entry( + id=f"/opds/library/{lib.id}", + title=lib.name, + link=[ + Link( + title=lib.name, + href=f"/opds/library/{lib.id}", + rel=LinkRelations.SUBSECTION, + type=LinkTypes.NAVIGATION + ) + ] + ) for lib in libraries + ] + + feed = create_navigation_feed( + id="/opds", + title="Root", + self_url="/opds", + links=[ + Link( + rel="search", + href="/opds/opensearch", + type="application/opensearchdescription+xml", + title="Search books", + ) + ], + entries=entries + ) + + return Response( + feed, + media_type="application/xml" + ) + + @get("/acquisition") + async def get_acquisition_feed( + self, + request: Request, + feed_id: str, + feed_title: str, + books_service: BookService, + book_filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [] + ) -> Response: + + all_filters = [*filters, *book_filters] + books, total = await books_service.list_and_count(*all_filters) + + limit, offset = extract_limit_offset(all_filters) + + links = [] + + # Create pagination links if it is a paginated feed + if request.query_params.get('paginated'): + pagination = create_pagination_links( + request=request, + total=total, + limit=limit, + offset=offset, + feed_title=feed_title, + link_type=LinkTypes.ACQUISITION + ) + + links.extend([link for link in [pagination.next_link, pagination.prev_link] if link]) + + # Add search link if this is a searchable feed + if request.query_params.get('search'): + links.append(create_search_link(request)) + + # Create self URL + self_url = f"{request.url.path}?{urlencode(list(request.query_params.items()), doseq=True)}" + + feed = create_acquisition_feed( + id=feed_id, + title=feed_title, + url=self_url, + books=books, + links=links, + ) + + return Response(feed, media_type="application/xml") + + + @get("/opensearch") + async def opensearch(self, user: m.User, request: Request) -> Response: + + return Response( + get_opensearch_document( + base_url=f'/opds/search?{urlencode(list(request.query_params.items()), doseq=True)}&' + ), + media_type="application/xml" + ) + + @get("/library/{library_id:int}") + async def get_library_feed(self, library: m.Library) -> Response: + + feed = create_library_navigation_feed(library) + + return Response(feed, media_type="application/xml") + + + @get("/library/{library_id:int}/{collection_type:str}") + async def get_library_collection_feed( + self, + collection_type: str, + library: m.Library, + user: m.User, + author_service: AuthorService, + shelf_service: ShelfService, + tag_service: TagService, + publisher_service: PublisherService, + request: Request, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [] + ) -> Response: + + service_map = { + 'shelves': (shelf_service, lambda: shelf_service.list_and_count( + *filters, + CollectionFilter("library_id", values=[library.id]), + OrderBy("name", "asc"), + m.BookList.user_id == user.id + )), + 'tags': (tag_service, lambda: tag_service.list_and_count( + *filters, + TagLibraryFilter(libraries=[library.id]), + OrderBy("name", "asc"), + uniquify=True, + )), + 'authors': (author_service, lambda: author_service.list_and_count( + *filters, + AuthorLibraryFilter(libraries=[library.id]), + OrderBy("name", "asc"), + uniquify=True + )), + 'publishers': (publisher_service, lambda: publisher_service.list_and_count( + *filters, + PublisherLibraryFilter(libraries=[library.id]), + OrderBy("name", "asc"), + uniquify=True + )) + } + + if collection_type not in service_map: + raise HTTPException(status_code=404, detail="Collection type not found") + + _, fetch_items = service_map[collection_type] + items, total = await fetch_items() + links = [] + + # Create pagination links if it is a paginated feed + limit, offset = extract_limit_offset(filters) + + if request.query_params.get('paginated'): + pagination = create_pagination_links( + request=request, + total=total, + limit=limit, + offset=offset, + feed_title=collection_type, + link_type=LinkTypes.ACQUISITION + ) + + links.extend([link for link in [pagination.next_link, pagination.prev_link] if link]) + + feed = create_collection_navigation_feed(library, collection_type, items, links) + return Response(feed, media_type="application/xml") + + + + @get("/search") + async def search_books( + self, books_service: BookService, + request: Request, + book_filters: Annotated[ + list[FilterTypeT], Dependency(skip_validation=True) + ] = [], + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [] + ) -> Response: + + filters = [*filters, *book_filters] + + books, total = await books_service.list_and_count( + *filters + ) + + limit, offset = extract_limit_offset(filters) + + # Create pagination links + pagination = create_pagination_links( + request=request, + total=total, + limit=limit, + offset=offset, + feed_title="Search Results", + link_type=LinkTypes.ACQUISITION + ) + + links = [link for link in [pagination.next_link, pagination.prev_link] if link] + + catalog_xml = create_acquisition_feed( + id=f"/opds/search?q=q", + title="Search results", + url=f"/opds/search?q=q", + books=books, + links=links + ) + + return Response(catalog_xml, media_type="application/xml") + + @get(path="download/{book_id:int}/{file_id:int}") + async def get_file( + self, book_id: int, file_id: int, books_service: BookService + ) -> File: + + return await books_service.get_file(book_id, file_id) + + +def extract_limit_offset(filters: list[FilterTypeT]) -> tuple[int, int]: + """Extract page size and offset from filters""" + limit_offset_filter = next( + (f for f in filters if isinstance(f, LimitOffset)), + None + ) + + if limit_offset_filter: + return limit_offset_filter.limit, limit_offset_filter.offset + + raise ValueError("LimitOffset filter not found") \ No newline at end of file diff --git a/backend/src/chitai/controllers/publisher.py b/backend/src/chitai/controllers/publisher.py new file mode 100644 index 0000000..c940e06 --- /dev/null +++ b/backend/src/chitai/controllers/publisher.py @@ -0,0 +1,72 @@ +# src/chitai/controllers/publisher.py + +# Standard library +from typing import Annotated + +# Third-party libraries +from litestar import Controller, post, get, patch, delete +from litestar.params import Dependency +from advanced_alchemy.extensions.litestar.providers import create_service_dependencies +from advanced_alchemy.service.pagination import OffsetPagination +from advanced_alchemy.service import FilterTypeT + +# Local imports +from chitai.services import PublisherService +from chitai.schemas import PublisherRead +from chitai.services.filters.publisher import PublisherLibraryFilter + + +class PublisherController(Controller): + """Controller for managing publisher information.""" + + path = "/publishers" + dependencies = create_service_dependencies( + PublisherService, + key="publisher_service", + filters={ + "id_filter": int, + "pagination_type": "limit_offset", + "sort_field": "name", + "search": ["name"], + "search_ignore_case": True, + }, + ) + + @get() + async def list_publishers( + self, + publisher_service: PublisherService, + libraries: list[int] | None = None, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + ) -> OffsetPagination[PublisherRead]: + """ + List publishers with filtering, pagination, and search. + + Supports searching by name and filtering by library. Results can be sorted + and paginated using standard query parameters. + + Query Parameters: + library_id: Optional library ID to filter publishers. If None, returns all publishers. + id_filter: Filter by publisher ID (from create_filter_dependencies). + sort_field: Field to sort by (default: 'name'). + search: Search term for publisher name field. + search_ignore_case: Case-insensitive search (default: True). + limit: Number of results per page (pagination). + offset: Number of results to skip (pagination). + + Injected Dependencies: + publisher_service: The publisher service for database operations. + filters: Pre-constructed filters from dependencies. + + Returns: + Paginated list of publishers matching the criteria. + """ + + filters.append(PublisherLibraryFilter(libraries)) + + publishers, total = await publisher_service.list_and_count( + *filters, uniquify=True + ) + return publisher_service.to_schema( + publishers, total, filters, schema_type=PublisherRead + ) diff --git a/backend/src/chitai/controllers/shelf.py b/backend/src/chitai/controllers/shelf.py new file mode 100644 index 0000000..cefdd62 --- /dev/null +++ b/backend/src/chitai/controllers/shelf.py @@ -0,0 +1,242 @@ +# src/chitai/controllers/shelf.py + +# Standard library +from typing import Annotated +import logging + +# Third-party libraries +from litestar import Controller, get, post, delete +from litestar.di import Provide +from litestar.params import Dependency +from litestar.status_codes import HTTP_403_FORBIDDEN +from litestar.exceptions import HTTPException +from advanced_alchemy.extensions.litestar.providers import create_filter_dependencies +from advanced_alchemy.service import OffsetPagination +from advanced_alchemy.service import FilterTypeT +from advanced_alchemy.exceptions import IntegrityError +from advanced_alchemy.filters import CollectionFilter +from sqlalchemy.orm import selectinload + +# Local imports +from chitai.schemas.shelf import ShelfCreate, ShelfRead +from chitai.services import dependencies as deps +from chitai.services.bookshelf import ShelfService +from chitai.database import models as m + +logger = logging.getLogger(__name__) + + +class BookshelfController(Controller): + """Controller for managing bookshelf operations.""" + + path = "/shelves" + dependencies = { + "shelf_service": Provide(deps.provide_shelf_service) + } | create_filter_dependencies( + {"id_filter": int, "pagination_type": "limit_offset", "search": "title"} + ) + + @get() + async def list_shelves( + self, + shelf_service: ShelfService, + current_user: m.User, + libraries: list[int] | None = None, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + ) -> OffsetPagination[ShelfRead]: + """ + List bookshelves for the authenticated user. + + Retrieves all shelves created by the current user, with optional filtering + and search by shelf title. + + Query Parameters: + library_id: Optional library ID to filter shelves (currently unused). + id_filter: Filter by shelf ID (from create_filter_dependencies). + search: Search term for shelf title (case-insensitive). + limit: Number of results per page (pagination). + offset: Number of results to skip (pagination). + + Injected Dependencies: + shelf_service: The shelf service for database operations. + current_user: The authenticated user making the request. + filters: Pre-constructed filters from dependencies. + + Returns: + Paginated list of the user's bookshelves. + """ + + if libraries: + filters.append(CollectionFilter("library_id", values=libraries)) + filters.append(m.BookList.user_id == current_user.id) + + results, total = await shelf_service.list_and_count(*filters, load=[selectinload(m.BookList.book_links)]) + return shelf_service.to_schema(results, total, filters, schema_type=ShelfRead) + + @post() + async def create_shelf( + self, data: ShelfCreate, current_user: m.User, shelf_service: ShelfService + ) -> ShelfRead: + """ + Create a new bookshelf for the authenticated user. + + Request Body: + data: Shelf creation data including title and optional description. + + Injected Dependencies: + current_user: The authenticated user creating the shelf. + shelf_service: The shelf service for database operations. + + Returns: + The created shelf as a ShelfRead schema. + """ + + try: + shelf = await shelf_service.create( + data.model_dump() | {"user_id": current_user.id} + ) + + await shelf_service.add_books(shelf.id, data.book_ids) + return shelf_service.to_schema(shelf, schema_type=ShelfRead) + + except IntegrityError: + raise HTTPException( + status_code=400, + detail=f"Library with ID {data.library_id} does not exist", + ) + + @delete("{shelf_id:int}") + async def delete_shelf( + self, shelf_id: int, current_user: m.User, shelf_service: ShelfService + ) -> None: + """ + Delete a bookshelf. + + Removes a shelf and all its associations. Only the shelf owner can delete it. + + Path Parameters: + shelf_id: The ID of the shelf to delete. + + Injected Dependencies: + current_user: The authenticated user (for authorization). + shelf_service: The shelf service for database operations. + + Raises: + HTTPException (403): If the user does not own the shelf. + HTTPException (404): If the shelf does not exist. + """ + shelf = await shelf_service.get(shelf_id) + + if shelf.user_id != current_user.id: + logger.warning( + f"Unauthorized deletion attempt: user {current_user.id} attempted to delete shelf {shelf_id}" + ) + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="You do not have permission to delete this shelf", + ) + + await shelf_service.delete(shelf_id) + + @post("{shelf_id:int}/books") + async def add_books_to_shelf( + self, + shelf_id: int, + book_ids: list[int], + current_user: m.User, + shelf_service: ShelfService, + ) -> ShelfRead: + """ + Add books to a bookshelf. + + Adds one or more books to an existing shelf. Only the shelf owner can add books. + + Path Parameters: + shelf_id: The ID of the shelf. + + Query Parameters: + book_ids: List of book IDs to add to the shelf. + + Injected Dependencies: + current_user: The authenticated user (for authorization). + shelf_service: The shelf service for database operations. + + Returns: + the updated shelf + + Raises: + HTTPException (403): If the user does not own the shelf. + HTTPException (404): If the shelf or any book does not exist. + """ + + shelf = await shelf_service.get(shelf_id) + + if shelf.user_id != current_user.id: + logger.warning( + f"Unauthorized add attempt: user {current_user.id} attempted to modify shelf {shelf_id}" + ) + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="You do not have permission to modify this shelf", + ) + + try: + bookshelf = await shelf_service.add_books(shelf_id, book_ids) + + except ValueError: + raise HTTPException( + status_code=400, detail="Attempted to add books that do not exist." + ) + + logger.debug( + f"Added {len(book_ids)} books to shelf {shelf_id} by user {current_user.id}" + ) + + return shelf_service.to_schema(bookshelf, schema_type=ShelfRead) + + @delete("{shelf_id:int}/books", status_code=200) + async def remove_books_from_shelf( + self, + shelf_id: int, + book_ids: list[int], + current_user: m.User, + shelf_service: ShelfService, + ) -> ShelfRead: + """ + Remove books from a bookshelf. + + Removes one or more books from a shelf. Only the shelf owner can remove books. + + Path Parameters: + shelf_id: The ID of the shelf. + + Query Parameters: + book_ids: List of book IDs to remove from the shelf. + + Injected Dependencies: + current_user: The authenticated user (for authorization). + shelf_service: The shelf service for database operations. + + Returns: + the updated shelf + + Raises: + HTTPException (403): If the user does not own the shelf. + HTTPException (404): If the shelf or any book does not exist. + """ + shelf = await shelf_service.get(shelf_id) + if shelf.user_id != current_user.id: + logger.warning( + f"Unauthorized remove attempt: user {current_user.id} attempted to modify shelf {shelf_id}" + ) + raise HTTPException( + status_code=HTTP_403_FORBIDDEN, + detail="You do not have permission to modify this shelf", + ) + + bookshelf = await shelf_service.remove_books(shelf_id, book_ids) + logger.debug( + f"Removed {len(book_ids)} books from shelf {shelf_id} by user {current_user.id}" + ) + + return shelf_service.to_schema(bookshelf, schema_type=ShelfRead) diff --git a/backend/src/chitai/controllers/tag.py b/backend/src/chitai/controllers/tag.py new file mode 100644 index 0000000..60be45f --- /dev/null +++ b/backend/src/chitai/controllers/tag.py @@ -0,0 +1,67 @@ +# src/chitai/controllers/tag.py + +# Standard library +from typing import Annotated + +# Third-party libraries +from litestar import Controller, post, get, patch, delete +from litestar.params import Dependency +from advanced_alchemy.extensions.litestar.providers import create_service_dependencies +from advanced_alchemy.service.pagination import OffsetPagination +from advanced_alchemy.service import FilterTypeT + +# Local imports +from chitai.services import TagService +from chitai.schemas import TagRead +from chitai.services.filters.tags import TagLibraryFilter + + +class TagController(Controller): + """Controller for managing tag information.""" + + path = "/tags" + dependencies = create_service_dependencies( + TagService, + key="tag_service", + filters={ + "id_filter": int, + "pagination_type": "limit_offset", + "sort_field": "name", + "search": ["name"], + "search_ignore_case": True, + }, + ) + + @get() + async def list_tags( + self, + tag_service: TagService, + libraries: list[int] | None = None, + filters: Annotated[list[FilterTypeT], Dependency(skip_validation=True)] = [], + ) -> OffsetPagination[TagRead]: + """ + List tags with filtering, pagination, and search. + + Supports searching by name and filtering by library. Results can be sorted + and paginated using standard query parameters. + + Query Parameters: + library_id: Optional library ID to filter tags. If None, returns all tags. + id_filter: Filter by tag ID (from create_filter_dependencies). + sort_field: Field to sort by (default: 'name'). + search: Search term for tag name field. + search_ignore_case: Case-insensitive search (default: True). + limit: Number of results per page (pagination). + offset: Number of results to skip (pagination). + + Injected Dependencies: + tag_service: The tag service for database operations. + filters: Pre-constructed filters from dependencies. + + Returns: + Paginated list of tags matching the criteria. + """ + filters.append(TagLibraryFilter(libraries)) + + tags, total = await tag_service.list_and_count(*filters, uniquify=True) + return tag_service.to_schema(tags, total, filters, schema_type=TagRead) diff --git a/backend/src/chitai/database/config.py b/backend/src/chitai/database/config.py new file mode 100644 index 0000000..b25f5d4 --- /dev/null +++ b/backend/src/chitai/database/config.py @@ -0,0 +1,23 @@ +from chitai.config import settings + +from advanced_alchemy.extensions.litestar import ( + SQLAlchemyAsyncConfig, + AsyncSessionConfig, + SQLAlchemyPlugin, +) +from sqlalchemy.ext.asyncio import create_async_engine +from chitai.database import models + +DATABASE_URL = str(settings.postgres_uri) + +session_config = AsyncSessionConfig(expire_on_commit=False) + +config = SQLAlchemyAsyncConfig( + engine_instance=create_async_engine(DATABASE_URL, echo=settings.postgres_echo), + session_config=session_config, + before_send_handler="autocommit", + create_all=True, + +) + +alchemy = SQLAlchemyPlugin(config=config) diff --git a/backend/src/chitai/database/models/__init__.py b/backend/src/chitai/database/models/__init__.py new file mode 100644 index 0000000..6ef8f15 --- /dev/null +++ b/backend/src/chitai/database/models/__init__.py @@ -0,0 +1,11 @@ +from .author import Author, BookAuthorLink +from .book import Book, Identifier, FileMetadata +from .book_list import BookList, BookListLink +from .book_progress import BookProgress +from .book_series import BookSeries +from .library import Library +from .publisher import Publisher +from .tag import Tag, BookTagLink +from .user import User + +from advanced_alchemy.base import BigIntBase diff --git a/backend/src/chitai/database/models/author.py b/backend/src/chitai/database/models/author.py new file mode 100644 index 0000000..4540327 --- /dev/null +++ b/backend/src/chitai/database/models/author.py @@ -0,0 +1,47 @@ +from typing import TYPE_CHECKING, Optional +from collections.abc import Hashable + +from sqlalchemy import ColumnElement, ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column +from sqlalchemy.orm import relationship + +from advanced_alchemy.base import BigIntAuditBase, BigIntBase +from advanced_alchemy.mixins import UniqueMixin + +if TYPE_CHECKING: + from .book import Book + + +class Author(BigIntAuditBase, UniqueMixin): + __tablename__ = "authors" + + name: Mapped[str] = mapped_column(unique=True, index=True) + description: Mapped[Optional[str]] + + @classmethod + def unique_hash(cls, name: str) -> Hashable: + """Generate a unique hash for deduplication.""" + return name + + @classmethod + def unique_filter(cls, name: str) -> ColumnElement[bool]: + """SQL filter for finding existing records.""" + return cls.name == name + + def __repr__(self) -> str: + return f"Author({self.name!r})" + + +class BookAuthorLink(BigIntBase): + __tablename__ = "book_author_links" + + book_id: Mapped[int] = mapped_column( + ForeignKey("books.id", ondelete="cascade"), primary_key=True + ) + author_id: Mapped[int] = mapped_column(ForeignKey("authors.id"), primary_key=True) + + position: Mapped[int] + + book: Mapped["Book"] = relationship(back_populates="author_links") + author: Mapped[Author] = relationship() diff --git a/backend/src/chitai/database/models/book.py b/backend/src/chitai/database/models/book.py new file mode 100644 index 0000000..3e69cb0 --- /dev/null +++ b/backend/src/chitai/database/models/book.py @@ -0,0 +1,152 @@ +from datetime import date +from typing import TYPE_CHECKING, Any, Optional + +from sqlalchemy import Index +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.orm import mapped_column +from sqlalchemy.orm import relationship +from sqlalchemy.ext.orderinglist import ordering_list +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy.ext.associationproxy import AssociationProxy +from sqlalchemy.orm.collections import attribute_keyed_dict + +from advanced_alchemy.base import BigIntAuditBase, BigIntBase + +from .author import Author, BookAuthorLink +from .publisher import Publisher +from .tag import Tag, BookTagLink +from .library import Library + + +if TYPE_CHECKING: + from chitai.database.models import ( + BookProgress, + BookList, + BookSeries, + BookListLink, + ) + + +class Book(BigIntAuditBase): + __tablename__ = "books" + + __table_args__ = ( + # Create trigram indexes + Index( + "ix_books_title_trigram", + "title", + postgresql_using="gin", + postgresql_ops={"title": "gin_trgm_ops"}, + ), + ) + + library_id: Mapped[int] = mapped_column(ForeignKey("libraries.id"), nullable=False) + library: Mapped["Library"] = relationship(back_populates="books") + + title: Mapped[str] + subtitle: Mapped[Optional[str]] + description: Mapped[Optional[str]] + published_date: Mapped[Optional[date]] + language: Mapped[Optional[str]] + pages: Mapped[Optional[int]] + cover_image: Mapped[Optional[str]] + edition: Mapped[Optional[int]] + path: Mapped[Optional[str]] + + library: Mapped[Library] = relationship(back_populates="books") + + author_links: Mapped[list["BookAuthorLink"]] = relationship( + back_populates="book", + cascade="all, delete-orphan", + passive_deletes=True, + order_by="BookAuthorLink.position", + collection_class=ordering_list("position"), + ) + + authors: AssociationProxy[list["Author"]] = association_proxy( + "author_links", "author", creator=lambda author: BookAuthorLink(author=author) + ) + + publisher_id: Mapped[Optional[int]] = mapped_column(ForeignKey("publishers.id")) + publisher: Mapped[Optional[Publisher]] = relationship() + + tag_links: Mapped[list["BookTagLink"]] = relationship( + back_populates="book", + cascade="all, delete-orphan", + passive_deletes=True, + order_by="BookTagLink.position", + collection_class=ordering_list("position"), + ) + + tags: AssociationProxy[list["Tag"]] = association_proxy( + "tag_links", "tag", creator=lambda tag: BookTagLink(tag=tag) + ) + + identifiers: Mapped[list["Identifier"]] = relationship( + cascade="all, delete-orphan", + passive_deletes=True, + ) + + files: Mapped[list["FileMetadata"]] = relationship( + cascade="all, delete-orphan", passive_deletes=True + ) + + list_links: Mapped[list["BookListLink"]] = relationship( + back_populates="book", cascade="all, delete-orphan", passive_deletes=True + ) + + lists: AssociationProxy[list["BookList"]] = association_proxy( + "list_links", "book_list" + ) + + series_id: Mapped[Optional[int]] = mapped_column(ForeignKey("book_series.id")) + series: Mapped[Optional["BookSeries"]] = relationship() + series_position: Mapped[Optional[str]] + + progress_records: Mapped[list["BookProgress"]] = relationship( + cascade="all, delete-orphan", passive_deletes=True + ) + + @property + def progress(self) -> Optional["BookProgress"]: + return self.progress_records[0] if self.progress_records else None + + def __repr__(self) -> str: + return f"Book({self.title=!r})" + + def to_dict(self, exclude: set[str] | None = None) -> dict[str, Any]: + data = super().to_dict(exclude) + data["authors"] = [author.name for author in self.authors] + data["tags"] = [tag.name for tag in self.tags] + data["publisher"] = self.publisher.name if self.publisher else None + data["series"] = self.series.title if self.series else None + data["files"] = [file.to_dict() for file in self.files] + return data + + +class Identifier(BigIntBase): + __tablename__ = "identifiers" + + name: Mapped[str] = mapped_column(primary_key=True) + book_id: Mapped[int] = mapped_column( + ForeignKey("books.id", ondelete="cascade"), primary_key=True + ) + value: Mapped[str] + + def __repr__(self): + return f"Identifier({self.name!r} : {self.value!r})" + + +class FileMetadata(BigIntBase): + __tablename__ = "file_metadata" + + book_id: Mapped[int] = mapped_column(ForeignKey("books.id", ondelete="cascade")) + book: Mapped[Book] = relationship(back_populates="files") + hash: Mapped[str] + path: Mapped[str] + size: Mapped[int] + content_type: Mapped[Optional[str]] + + def __repr__(self) -> str: + return f"FileMetadata({self.path!r})" diff --git a/backend/src/chitai/database/models/book_list.py b/backend/src/chitai/database/models/book_list.py new file mode 100644 index 0000000..05edfea --- /dev/null +++ b/backend/src/chitai/database/models/book_list.py @@ -0,0 +1,48 @@ +from typing import Optional +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.ext.associationproxy import association_proxy, AssociationProxy +from sqlalchemy.ext.orderinglist import ordering_list + +from advanced_alchemy.base import BigIntAuditBase, BigIntBase + +from .book import Book + + +class BookList(BigIntAuditBase): + __tablename__ = "book_lists" + + library_id: Mapped[Optional[int]] = mapped_column( + ForeignKey("libraries.id"), nullable=True + ) + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + title: Mapped[str] + book_links: Mapped[list["BookListLink"]] = relationship( + back_populates="book_list", + cascade="all, delete-orphan", + order_by="BookListLink.position", + collection_class=ordering_list("position"), + ) + books: AssociationProxy[list[Book]] = association_proxy( + "book_links", "book", creator=lambda book: BookListLink(book=book) + ) + + @property + def total(self) -> int | None: + """Return count of books if book_links is loaded, None otherwise.""" + try: + return len(self.book_links) if self.book_links else 0 + except Exception: + return None + + +class BookListLink(BigIntBase): + __tablename__ = "book_list_links" + book_id: Mapped[int] = mapped_column( + ForeignKey("books.id", ondelete="cascade"), primary_key=True + ) + list_id: Mapped[int] = mapped_column(ForeignKey("book_lists.id"), primary_key=True) + position: Mapped[int] + + book: Mapped[Book] = relationship(back_populates="list_links") + book_list: Mapped[BookList] = relationship(back_populates="book_links") diff --git a/backend/src/chitai/database/models/book_progress.py b/backend/src/chitai/database/models/book_progress.py new file mode 100644 index 0000000..23c2fc4 --- /dev/null +++ b/backend/src/chitai/database/models/book_progress.py @@ -0,0 +1,20 @@ +from typing import Optional +from sqlalchemy import ForeignKey +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.orm import relationship +from advanced_alchemy.base import BigIntAuditBase + + +class BookProgress(BigIntAuditBase): + __tablename__ = "book_progress" + + user_id: Mapped[int] = mapped_column( + ForeignKey("users.id", ondelete="cascade"), nullable=False + ) + book_id: Mapped[int] = mapped_column( + ForeignKey("books.id", ondelete="cascade"), nullable=False + ) + epub_loc: Mapped[Optional[str]] + pdf_loc: Mapped[Optional[int]] + progress: Mapped[float] + completed: Mapped[Optional[bool]] diff --git a/backend/src/chitai/database/models/book_series.py b/backend/src/chitai/database/models/book_series.py new file mode 100644 index 0000000..63968b8 --- /dev/null +++ b/backend/src/chitai/database/models/book_series.py @@ -0,0 +1,24 @@ +from collections.abc import Hashable +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy import ColumnElement, ForeignKey + +from advanced_alchemy.base import BigIntAuditBase +from advanced_alchemy.mixins import UniqueMixin + +from .book import Book + + +class BookSeries(BigIntAuditBase, UniqueMixin): + __tablename__ = "book_series" + + title: Mapped[str] = mapped_column(unique=True, index=True) + + @classmethod + def unique_hash(cls, title: str) -> Hashable: + """Generate a unique hash for deduplication.""" + return title + + @classmethod + def unique_filter(cls, title: str) -> ColumnElement[bool]: + """SQL filter for finding existing records.""" + return cls.title == title diff --git a/backend/src/chitai/database/models/library.py b/backend/src/chitai/database/models/library.py new file mode 100644 index 0000000..049a7f7 --- /dev/null +++ b/backend/src/chitai/database/models/library.py @@ -0,0 +1,33 @@ +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from advanced_alchemy.base import BigIntAuditBase +from advanced_alchemy.mixins import SlugKey + +from typing import TYPE_CHECKING, Optional + +if TYPE_CHECKING: + from .book import Book + + +class Library(BigIntAuditBase, SlugKey): + __tablename__ = "libraries" + + name: Mapped[str] = mapped_column(unique=True) + root_path: Mapped[str] + # Which structure to save the files in the filesystem (i.e {author_name}/{title}.{ext}) + path_template: Mapped[str] + description: Mapped[Optional[str]] + read_only: Mapped[bool] = mapped_column(nullable=False, default=False) + + books: Mapped[list["Book"]] = relationship(back_populates="library") + + @property + def total(self) -> int | None: + """Return count of books if books is loaded, None otherwise.""" + try: + return len(self.books) if self.books else 0 + except Exception: + return None + + def __repr__(self) -> str: + return f"Library({self.name=!r})" diff --git a/backend/src/chitai/database/models/publisher.py b/backend/src/chitai/database/models/publisher.py new file mode 100644 index 0000000..82af464 --- /dev/null +++ b/backend/src/chitai/database/models/publisher.py @@ -0,0 +1,28 @@ +from collections.abc import Hashable +from typing import Optional + +from sqlalchemy import ColumnElement +from sqlalchemy.orm import Mapped + +from advanced_alchemy.base import BigIntAuditBase +from advanced_alchemy.mixins import UniqueMixin + + +class Publisher(BigIntAuditBase, UniqueMixin): + __tablename__ = "publishers" + + name: Mapped[str] + description: Mapped[Optional[str]] + + @classmethod + def unique_hash(cls, name: str) -> Hashable: + """Generate a unique hash for deduplication.""" + return name + + @classmethod + def unique_filter(cls, name: str) -> ColumnElement[bool]: + """SQL filter for finding existing records.""" + return cls.name == name + + def __repr__(self) -> str: + return f"Publisher({self.name!r})" diff --git a/backend/src/chitai/database/models/tag.py b/backend/src/chitai/database/models/tag.py new file mode 100644 index 0000000..c449803 --- /dev/null +++ b/backend/src/chitai/database/models/tag.py @@ -0,0 +1,49 @@ +from collections.abc import Hashable +from typing import TYPE_CHECKING + +from sqlalchemy import ColumnElement, ForeignKey +from sqlalchemy.orm import Mapped +from sqlalchemy.orm import mapped_column +from sqlalchemy.orm import relationship + +from advanced_alchemy.base import BigIntBase +from advanced_alchemy.mixins import UniqueMixin + + +if TYPE_CHECKING: + from .book import Book + + +class Tag(BigIntBase, UniqueMixin): + __tablename__ = "tags" + + name: Mapped[str] = mapped_column(unique=True, index=True) + + @classmethod + def unique_hash(cls, name: str) -> Hashable: + """Generate a unique hash for deduplication.""" + return name + + @classmethod + def unique_filter(cls, name: str) -> ColumnElement[bool]: + """SQL filter for finding existing records.""" + return cls.name == name + + def __repr__(self) -> str: + return f"Tag({self.name!r})" + + +class BookTagLink(BigIntBase): + __tablename__ = "book_tag_link" + + book_id: Mapped[int] = mapped_column( + ForeignKey("books.id", ondelete="cascade"), primary_key=True + ) + + tag_id: Mapped[int] = mapped_column(ForeignKey("tags.id"), primary_key=True) + + position: Mapped[int] + + book: Mapped["Book"] = relationship(back_populates="tag_links") + + tag: Mapped[Tag] = relationship() diff --git a/backend/src/chitai/database/models/user.py b/backend/src/chitai/database/models/user.py new file mode 100644 index 0000000..54473f6 --- /dev/null +++ b/backend/src/chitai/database/models/user.py @@ -0,0 +1,25 @@ +from typing import TYPE_CHECKING +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from advanced_alchemy.base import BigIntAuditBase +from advanced_alchemy.types import PasswordHash, HashedPassword +from advanced_alchemy.types.password_hash.pwdlib import PwdlibHasher + +from pwdlib.hashers.argon2 import Argon2Hasher as PwdlibArgon2Hasher + +if TYPE_CHECKING: + from chitai.database.models import BookList + + PasswordType = HashedPassword +else: + PasswordType = str + + +class User(BigIntAuditBase): + __tablename__ = "users" + + email: Mapped[str] = mapped_column(unique=True) + password: Mapped[PasswordType] = mapped_column( + PasswordHash(backend=PwdlibHasher(hasher=PwdlibArgon2Hasher())) + ) + shelves: Mapped[list["BookList"]] = relationship(cascade="all, delete-orphan") diff --git a/backend/src/chitai/exceptions/handlers.py b/backend/src/chitai/exceptions/handlers.py new file mode 100644 index 0000000..b59b7f3 --- /dev/null +++ b/backend/src/chitai/exceptions/handlers.py @@ -0,0 +1,17 @@ +from litestar import Request, Response, MediaType +from litestar.exceptions import HTTPException +from litestar.status_codes import HTTP_404_NOT_FOUND + +from advanced_alchemy.exceptions import NotFoundError + + +def not_found_exception_handler(_: Request, exc: NotFoundError) -> Response: + """Default handler for NotFoundError.""" + return Response( + media_type=MediaType.TEXT, + content=f"Not found error: {exc.detail}", + status_code=404, + ) + + +exception_handlers = {NotFoundError: not_found_exception_handler} diff --git a/backend/src/chitai/middleware/basic_auth.py b/backend/src/chitai/middleware/basic_auth.py new file mode 100644 index 0000000..e5d8df7 --- /dev/null +++ b/backend/src/chitai/middleware/basic_auth.py @@ -0,0 +1,35 @@ +from base64 import b64decode +from chitai.services.user import UserService +from litestar.middleware import ( + AbstractAuthenticationMiddleware, + AuthenticationResult, + DefineMiddleware +) +from litestar.connection import ASGIConnection +from litestar.exceptions import NotAuthorizedException, PermissionDeniedException +from chitai.config import settings + + +class BasicAuthenticationMiddleware(AbstractAuthenticationMiddleware): + async def authenticate_request(self, connection: ASGIConnection) -> AuthenticationResult: + """Given a request, parse the header for Base64 encoded basic auth credentials. """ + + # retrieve the auth header + auth_header = connection.headers.get("Authorization", None) + if not auth_header: + raise NotAuthorizedException() + + username, password = b64decode(auth_header.split("Basic ")[1]).decode().split(":") + + + try: + db_session = settings.alchemy_config.provide_session(connection.app.state, connection.scope) + user_service = UserService(db_session) + user = await user_service.authenticate(username, password) + return AuthenticationResult(user=user, auth=None) + + except PermissionDeniedException: + raise NotAuthorizedException() + + +basic_auth_mw = DefineMiddleware(BasicAuthenticationMiddleware) \ No newline at end of file diff --git a/backend/src/chitai/schemas/__init__.py b/backend/src/chitai/schemas/__init__.py new file mode 100644 index 0000000..8b5d97a --- /dev/null +++ b/backend/src/chitai/schemas/__init__.py @@ -0,0 +1,16 @@ +from .book import ( + BookCreate, + BookRead, + BookProgressCreate, + BookProgressRead, + BooksCreateFromFiles, + BookMetadataUpdate, + FileMetadataRead, + BookSeriesRead, +) +from .shelf import ShelfRead, ShelfCreate +from .library import LibraryCreate, LibraryRead +from .user import UserCreate, UserLogin, UserRead +from .author import AuthorRead +from .tag import TagRead +from .publisher import PublisherRead diff --git a/backend/src/chitai/schemas/author.py b/backend/src/chitai/schemas/author.py new file mode 100644 index 0000000..0bc4bfe --- /dev/null +++ b/backend/src/chitai/schemas/author.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class AuthorRead(BaseModel): + id: int + name: str diff --git a/backend/src/chitai/schemas/book.py b/backend/src/chitai/schemas/book.py new file mode 100644 index 0000000..54e4bcd --- /dev/null +++ b/backend/src/chitai/schemas/book.py @@ -0,0 +1,174 @@ +from datetime import date +import json +from pathlib import Path +from typing import Annotated, Optional, Union +from pydantic import ( + BaseModel, + BeforeValidator, + ConfigDict, + Field, + SkipValidation, + field_validator, + computed_field, +) + +from litestar.datastructures import UploadFile + +from chitai.schemas.shelf import ShelfRead +from chitai.schemas.author import AuthorRead +from chitai.schemas.tag import TagRead +from chitai.schemas.publisher import PublisherRead + + +class BookSeriesRead(BaseModel): + id: int + title: str + + +class FileMetadataRead(BaseModel): + id: int + path: str + hash: str + size: int + content_type: str + + @computed_field + @property + def filename(self) -> str: + return Path(self.path).name + + +class BookRead(BaseModel): + id: int + library_id: int + title: str + subtitle: str | None + description: str | None + cover_image: Path | None + authors: list["AuthorRead"] + edition: int | None + publisher: Optional["PublisherRead"] + published_date: date | None + identifiers: dict[str, str] + language: str | None + pages: int | None + tags: list["TagRead"] + lists: list[ShelfRead] + series: Optional["BookSeriesRead"] + series_position: str | None + files: list["FileMetadataRead"] + progress: Union["BookProgressRead", None] = None + + @field_validator("identifiers", mode="before") + @classmethod + def convert_dict(cls, value) -> dict[str, str]: + if isinstance(value, list): + return {item.name: item.value for item in value} + return value + + +def split_string_and_remove_duplicates(value: list | str) -> list: + if isinstance( + value, str + ): # If a string was received, split it into individual authors + value = value.split(",") + + return list(dict.fromkeys(value)) # Remove duplicates, keep insertion order + + +class BookCreate(BaseModel): + library_id: int + title: str | None = None + subtitle: str | None = None + description: str | None = None + authors: Annotated[ + list[str], + BeforeValidator(split_string_and_remove_duplicates), + ] = Field(default_factory=list) + tags: Annotated[ + list[str], + BeforeValidator(split_string_and_remove_duplicates), + ] = Field(default_factory=list) + edition: int | None = None + publisher: str | None = None + published_date: date | None = None + identifiers: dict[str, str] | None = Field(default_factory=dict) + language: str | None = None + pages: int | None = None + + series: str | None = None + series_position: str | None = None + cover_image: Annotated[UploadFile | None, SkipValidation] = None + files: Annotated[list[UploadFile], SkipValidation] = Field(default_factory=list) + + @field_validator("identifiers", mode="before") + @classmethod + def to_dict(cls, value) -> dict[str, str]: + if isinstance(value, str): + return json.loads(value) + return value or {} + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class BooksCreateFromFiles(BaseModel): + """Upload schema for multiple books with only files.""" + + files: Annotated[list[UploadFile], SkipValidation, Field(default_factory=list)] + + model_config = ConfigDict(arbitrary_types_allowed=True) + + +class BookMetadataUpdate(BaseModel): + title: str | None = None + subtitle: str | None = None + description: str | None = None + authors: Annotated[ + list[str], + BeforeValidator(split_string_and_remove_duplicates), + Field(default_factory=list), + ] + tags: Annotated[ + list[str], + BeforeValidator(split_string_and_remove_duplicates), + Field(default_factory=list), + ] + edition: int | None = None + publisher: str | None = None + published_date: date | None = None + identifiers: dict[str, str] | None = dict() + language: str | None = None + pages: int | None = None + + series: str | None = None + series_position: str | None = None + + @field_validator("identifiers", mode="before") + @classmethod + def to_dict(cls, value) -> dict[str, str]: + if isinstance(value, str): + return json.loads(value) + return value or {} + + model_config = ConfigDict(arbitrary_types_allowed=True) + + @field_validator("title", mode="before") + @classmethod + def title_not_none(cls, v): + if v is None: + raise ValueError("title cannot be explicitly set to None") + return v + + +class BookProgressCreate(BaseModel): + progress: float + epub_loc: str | None = None + pdf_loc: int | None = None + completed: bool | None = None + + +class BookProgressRead(BaseModel): + progress: float + epub_loc: str | None = None + pdf_loc: int | None = None + completed: bool | None = False diff --git a/backend/src/chitai/schemas/library.py b/backend/src/chitai/schemas/library.py new file mode 100644 index 0000000..0cfcc2e --- /dev/null +++ b/backend/src/chitai/schemas/library.py @@ -0,0 +1,33 @@ +from pathlib import Path +from typing import Annotated +from pydantic import BaseModel, Field, computed_field +from advanced_alchemy.utils.text import slugify + +class LibraryCreate(BaseModel): + name: Annotated[str, Field(min_length=1)] + root_path: str + path_template: str | None = "{author}/{title}" + description: str | None = None + read_only: bool = False + + @computed_field + @property + def slug(self) -> str: + return slugify(self.name) + +class LibraryRead(BaseModel): + id: int + name: str + root_path: str + path_template: str + description: str | None + read_only: bool + total: int | None = None + + +class LibraryUpdate(BaseModel): + name: str | None + root_path: str | None + path_template: str | None + description: str | None + read_only: bool | None diff --git a/backend/src/chitai/schemas/publisher.py b/backend/src/chitai/schemas/publisher.py new file mode 100644 index 0000000..d5ed6a5 --- /dev/null +++ b/backend/src/chitai/schemas/publisher.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class PublisherRead(BaseModel): + id: int + name: str diff --git a/backend/src/chitai/schemas/shelf.py b/backend/src/chitai/schemas/shelf.py new file mode 100644 index 0000000..75c233f --- /dev/null +++ b/backend/src/chitai/schemas/shelf.py @@ -0,0 +1,19 @@ +from pydantic import BaseModel, ConfigDict, Field, field_validator + + +class ShelfRead(BaseModel): + id: int + title: str + library_id: int | None = None + total: int | None = None # Number of books in the shelf + + +class ShelfCreate(BaseModel): + title: str = Field(min_length=1) + library_id: int | None = None + book_ids: list[int] = [] + + @field_validator("title", mode="before") + @classmethod + def strip_title(cls, v: str) -> str: + return v.strip() if isinstance(v, str) else v diff --git a/backend/src/chitai/schemas/tag.py b/backend/src/chitai/schemas/tag.py new file mode 100644 index 0000000..5f6bfd7 --- /dev/null +++ b/backend/src/chitai/schemas/tag.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel + + +class TagRead(BaseModel): + id: int + name: str diff --git a/backend/src/chitai/schemas/user.py b/backend/src/chitai/schemas/user.py new file mode 100644 index 0000000..805d812 --- /dev/null +++ b/backend/src/chitai/schemas/user.py @@ -0,0 +1,23 @@ +from typing import Annotated +from pydantic import BaseModel, BeforeValidator + + +def is_strong(value: str) -> str: + if len(value) < 8: + raise ValueError("Password must be at least 8 characters long") + + return value + + +class UserCreate(BaseModel): + email: str + password: Annotated[str, BeforeValidator(is_strong)] + + +class UserRead(BaseModel): + email: str + + +class UserLogin(BaseModel): + email: str + password: str diff --git a/backend/src/chitai/services/__init__.py b/backend/src/chitai/services/__init__.py new file mode 100644 index 0000000..9be8aad --- /dev/null +++ b/backend/src/chitai/services/__init__.py @@ -0,0 +1,8 @@ +from .book import BookService +from .library import LibraryService +from .user import UserService +from .bookshelf import ShelfService +from .author import AuthorService +from .tag import TagService +from .publisher import PublisherService +from .book_progress import BookProgressService diff --git a/backend/src/chitai/services/author.py b/backend/src/chitai/services/author.py new file mode 100644 index 0000000..153c161 --- /dev/null +++ b/backend/src/chitai/services/author.py @@ -0,0 +1,19 @@ +# src/chitai/services/author.py + +# Third-party libraries +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository + +# Local Imports +from chitai.database.models import Author + + +class AuthorService(SQLAlchemyAsyncRepositoryService[Author]): + """Author service for managing author operations.""" + + class Repo(SQLAlchemyAsyncRepository[Author]): + """Author repository.""" + + model_type = Author + + repository_type = Repo diff --git a/backend/src/chitai/services/book.py b/backend/src/chitai/services/book.py new file mode 100644 index 0000000..ca4aa0c --- /dev/null +++ b/backend/src/chitai/services/book.py @@ -0,0 +1,610 @@ +# src/chitai/services/book.py + +# Standard library +from __future__ import annotations +from collections import defaultdict +import mimetypes + +from io import BytesIO +from pathlib import Path +import uuid +import zipfile +from typing import TYPE_CHECKING, Any, AsyncIterator + +# Third-party libraries +from advanced_alchemy.extensions.litestar import service +from advanced_alchemy.service import ( + SQLAlchemyAsyncRepositoryService, + ModelDictT, + is_dict, +) +from advanced_alchemy.repository import SQLAlchemyAsyncRepository +from advanced_alchemy.filters import CollectionFilter +from sqlalchemy import inspect +from litestar.response import File +from litestar.datastructures import UploadFile +import aiofiles +from aiofiles import os as aios +from PIL import Image + +# Local imports +from chitai.config import settings +from chitai.database.models import ( + Book, + Author, + Tag, + Publisher, + BookSeries, + FileMetadata, + Identifier, + BookList, + Library, +) +from chitai.database.models.book_progress import BookProgress +from chitai.schemas.book import BooksCreateFromFiles +from chitai.services.filesystem_library import BookPathGenerator +from chitai.services.metadata_extractor import Extractor as MetadataExtractor +from chitai.services.utils import ( + cleanup_empty_parent_directories, + delete_directory, + delete_file, + is_empty, + move_dir_contents, + move_file, + save_image, +) + + +class BookService(SQLAlchemyAsyncRepositoryService[Book]): + """Book service for managing book operations.""" + + class Repo(SQLAlchemyAsyncRepository[Book]): + """Book repository.""" + + model_type = Book + + repository_type = Repo + + + + async def create(self, data: ModelDictT[Book], library: Library, **kwargs) -> Book: + """ + Create a new book entity. + + Orchestrates the full book creation pipeline: extracting metadata from files, + saving cover images, and storing book files to the filesystem. + + Args: + data: Book data as a dictionary or model. + library: The library the book belongs to. + *args: Additional positional arguments passed to parent create. + **kwargs: Additional keyword arguments passed to parent create. + + Returns: + The created Book entity. + """ + if not is_dict(data): + data = data.model_dump() + + await self._parse_metadata_from_files(data) + + await self._save_cover_image(data) + await self._save_book_files(library, data) + + return await super().create(data, **kwargs) + + async def create_many_from_files( + self, data: BooksCreateFromFiles, library: Library, **kwargs + ) -> list[Book]: + """ + Create multiple books from uploaded files. + + Groups files by their parent directory to organize books. Files in the root + directory are treated as separate individual books. + + Args: + data: Container with list of uploaded files. + library: The library the books belong to. + *args: Additional positional arguments passed to create. + **kwargs: Additional keyword arguments passed to create. + + Returns: + List of created Book entities. + """ + + if not data.files: + raise ValueError("Must upload at least one file") + + # Group book files if they are within the same nested directory + books = defaultdict(list) + for file in data.files: + filepath = Path(file.filename) + # Books within the root directory should be treated as separate books + if len(filepath.parent.parts) > 1: + books[filepath.parent].append(file) + else: + books[filepath].append(file) + + return [ + await self.create( + {"files": [file for file in files], "library_id": library.id}, + library, + **kwargs, + ) + for files in books.values() + ] + + async def create_many_from_existing_files( + self, + file_paths: list[Path], + consume_path: Path, + library: Library, + **kwargs + ) -> list[Book]: + + # Group up files if they are in the same leaf directory + + books = [] + file_groups: dict[Path, list[Path]] = defaultdict(list) + + + for file_path in file_paths: + rel_path = file_path.relative_to(consume_path) + parent_rel = rel_path.parent + + # Files at root level should each be in their own group + # Use the file's relative path as the group key instead of parent + if parent_rel == Path("."): + group_key = rel_path # Use the file itself as the key + else: + group_key = parent_rel # Use parent directory as key + + # Add to appropriate group + file_groups[group_key].append(file_path) + + + # For each grouping + for group, files in file_groups.items(): + data: dict[str, Any] = {'files': files} + await self._parse_metadata_from_files(data, root_path=consume_path) + await self._save_cover_image(data) + + # Get info from files + path_gen = BookPathGenerator(library.root_path) + parent = path_gen.generate_path(data) + data["path"] = str(parent) + data["library_id"] = library.id + file_metadata = [] + + for file in files: + + stats = await aios.stat(file) + file_size = stats.st_size + content_type, _ = mimetypes.guess_type(file) + + filename = path_gen.generate_filename(data, Path(file.name)) + + file_metadata.append( + FileMetadata( + path=str(filename), + size=file_size, + hash="stub-hash", # TODO: implement file hashing to catch duplicates + content_type=content_type, + ) + ) + + data["files"] = file_metadata + + # Move files to appropriate directory + if len(files) > 1: + await move_dir_contents(consume_path / group, parent) + else: + if len(group.parts) > 1: + await move_file(consume_path / group / files[0].name, parent / files[0].name) + else: + await move_file(consume_path / group, parent / group) + + cleanup_empty_parent_directories(consume_path / group, consume_path) + + books.append(await super().create(data)) + await self.repository.session.commit() + + return books + + async def delete( + self, + book_ids: list[int], + library: Library, + delete_files: bool = False, + **kwargs, + ) -> None: + """ + Delete books and optionally delete their associated files. + + Removes book records from the database and optionally deletes files from the + filesystem, including cover images and book files. + + Args: + book_ids: List of book IDs to delete. + library: The library containing the books. + delete_files: If True, also delete associated files from the filesystem. + **kwargs: Additional keyword arguments. + """ + books = await self.list( + CollectionFilter(field_name="id", values=book_ids), + Book.library_id == library.id, + ) + + for book in books: + await self.remove_files( + book.id, + [file.id for file in book.files], + library=library, + delete_files=delete_files, + ) + + if book.cover_image: + await delete_file(book.cover_image) + + await super().delete_many(book_ids) + + async def get_file(self, book_id: int, file_id: int) -> File: + """ + Retrieve a file for download. + + Args: + book_id: The ID of the book containing the file. + file_id: The ID of the file to retrieve. + + Returns: + A File object ready for download. + + Raises: + ValueError: If the file is missing or not found for the given book. + """ + book = await self.get(book_id) + for file in book.files: + if file.id != file_id: + continue + + path = Path(book.path) / Path(file.path) + if not await aios.path.isfile(path): + raise ValueError("The file is missing") + + return File(path, media_type=file.content_type) + + raise ValueError("No such file for the given book") + + async def get_files( + self, book_ids: list[int], library_id: int + ) -> AsyncIterator[bytes]: + """ + Get all selected book files as a compressed zip file. + + Streams the zip file in chunks to avoid loading the entire file into memory. + + Args: + book_ids: List of book IDs to include in the zip. + library_id: The ID of the library containing the books. + + Yields: + Chunks of compressed zip file data. + """ + books = await self.list(Book.id.in_(book_ids), Book.library_id == library_id) + + files = [file for book in books for file in book.files] + + buffer = BytesIO() + with zipfile.ZipFile(buffer, "w", zipfile.ZIP_DEFLATED) as zip_file: + for file in files: + path = Path(file.path) + if path.exists(): + zip_file.write(path, arcname=path.name) + + buffer.seek(0) + chunk_size = 32768 # 32 KiB + while True: + chunk = buffer.read(chunk_size) + if not chunk: + break + yield chunk + + async def update( + self, book_id: int, update_data: ModelDictT[Book], library: Library + ) -> Book: + """ + Update a book's metadata and files. + + Handles cover image updates, path reorganization based on updated metadata, + and cleanup of empty directories. Ensures related entities (authors, series, etc.) + remain unique in the database. + + Args: + book_id: The ID of the book to update. + update_data: The updated book data. + library: The library containing the book. + + Returns: + The updated Book entity. + """ + book = await self.get(book_id) + + if not is_dict(update_data): + data = service.schema_dump(update_data, exclude_unset=True) + else: + data = update_data + + data["id"] = book_id + + if data.get("cover_image", None): + # Delete the existing cover image + if book.cover_image: + await delete_file(book.cover_image) + await self._save_cover_image(data) + + # TODO: extract out into its own function _update_book_path + # Check if file path must be updated + path_gen = BookPathGenerator(library.root_path) + updated_path = path_gen.generate_path(book.to_dict() | data) + if str(updated_path) != book.path: + # TODO: Move only the files associated with the book instead of the whole directory + await move_dir_contents(book.path, updated_path) + data["path"] = str(updated_path) + cleanup_empty_parent_directories(Path(book.path), Path(library.root_path)) + + return await super().update(data, item_id=book_id, execution_options={"populate_existing": True}) + + async def add_files( + self, book_id: int, files: list[UploadFile], library: Library + ) -> None: + """ + Add additional files to an existing book. + + Args: + book_id: The ID of the book. + files: List of files to add. + library: The library containing the book. + """ + book = await self.get(book_id) + data = book.to_dict() + data["files"] = files + await self._save_book_files(library, data) + book.files.extend(data["files"]) + await self.update(book.id, {"files": [file for file in book.files]}, library) + + async def remove_files( + self, book_id: int, file_ids: list[int], delete_files: bool, library: Library + ) -> None: + """ + Remove files from an existing book. + + Optionally deletes the files from the filesystem and cleans up empty directories. + + Args: + book_id: The ID of the book. + file_ids: List of file IDs to remove. + delete_files: If True, also delete the files from the filesystem. + library: The library containing the book. + """ + book = await self.get_one(Book.id == book_id, Book.library_id == library.id) + + if delete_files: + # TODO: Extract this out into its own function + for file in (file for file in book.files if file.id in file_ids): + full_path = Path(book.path) / Path(file.path) + if await aios.path.isfile(full_path): + await aios.remove(full_path) + + cleanup_empty_parent_directories( + Path(book.path), Path(library.root_path) + ) + + book.files = [file for file in book.files if file.id not in file_ids] + + await super().update(book.files, book.id) + + async def to_model_on_create(self, data: ModelDictT[Book]) -> ModelDictT[Book]: + """ + Hook called during model creation to populate unique relationships. + + Args: + data: The book data to transform. + + Returns: + The transformed data with unique relationship entities. + """ + data = service.schema_dump(data) + self._preprocess_book_data(data) + return await self._populate_with_unique_relationships(data) + + async def to_model_on_update(self, data: ModelDictT[Book]) -> ModelDictT[Book]: + """ + Hook called during model update to populate unique relationships. + + Args: + data: The book data to transform. + + Returns: + The transformed data with unique relationship entities. + """ + data = service.schema_dump(data) + self._preprocess_book_data(data) + model_data = await self._populate_with_unique_relationships(data) + + return model_data + + def _preprocess_book_data(self, data: dict) -> dict: + """Transform API input format to model format.""" + if not isinstance(data, dict): + return data + + # Transform dict identifiers to list of Identifier objects + if "identifiers" in data and isinstance(data["identifiers"], dict): + data["identifiers"] = [ + Identifier(name=key, value=val) + for key, val in data["identifiers"].items() + ] + + return data + + async def _populate_with_unique_relationships(self, data: ModelDictT[Book]): + """ + Ensure relationship entities (authors, series, tags, etc.) are unique in the database. + + Fetches or creates unique instances of related entities to prevent duplicates. + + Args: + data: Book data containing relationship fields. + + Returns: + The data with relationship entities replaced by unique instances. + """ + if not isinstance(data, dict): + return data + + if data.get("id", None): + model_data = await super().get(data["id"]) + + # Update all scalar fields dynamically + mapper = inspect(Book) + for column in mapper.columns: + if column.name in data: + setattr(model_data, column.name, data[column.name]) + else: + model_data = await super().to_model(data) + + if "authors" in data: + model_data.authors = [ + await Author.as_unique_async(self.repository.session, name=author) + for author in data["authors"] + ] + + if "series" in data: + if data["series"]: + model_data.series = await BookSeries.as_unique_async( + self.repository.session, title=data["series"] + ) + else: + model_data.series = None + + if "publisher" in data: + if data["publisher"]: + model_data.publisher = await Publisher.as_unique_async( + self.repository.session, name=data["publisher"] + ) + else: + model_data.publisher = None + + if "tags" in data: + model_data.tags = [ + await Tag.as_unique_async(self.repository.session, name=tag) + for tag in data["tags"] + ] + + if "identifiers" in data: + model_data.identifiers = data["identifiers"] + + if "files" in data: + model_data.files = data["files"] + + return model_data + + async def _save_book_files(self, library: Library, data: dict) -> dict: + """ + Save uploaded book files to the filesystem. + + Uses the library's path template to organize files and extracts file metadata + (size, content type, etc.) for database storage. + + Args: + library: The library containing the book. + data: Book data with files to save. + + Returns: + The data with file paths and metadata populated. + """ + # Use the library template path with the book's data to generate a filepath + path_gen = BookPathGenerator(library.root_path) + parent = path_gen.generate_path(data) + data["path"] = str(parent) + + file_metadata = [] + CHUNK_SIZE = 262144 # 256 KiB + for file in data.pop("files", []): + if TYPE_CHECKING: + file: UploadFile + + # TODO filename should be generated with generate_path function + filename = path_gen.generate_filename(data, Path(file.filename).name) + + # Store files in the correct directory and return the file's metadata + await file.seek(0) + path = parent / filename + path.parent.mkdir(parents=True, exist_ok=True) + async with aiofiles.open(path, "wb") as dest: + # Read spooled file and save it to the local filesystem + while chunk := await file.read(CHUNK_SIZE): + await dest.write(chunk) + + stats = await aios.stat(path) + file_size = stats.st_size + + file_metadata.append( + FileMetadata( + path=str(filename), + size=file_size, + hash="stub-hash", # TODO: implement file hashing to catch duplicates + content_type=file.content_type, + ) + ) + + data["files"] = file_metadata + return data + + async def _parse_metadata_from_files(self, data: dict, root_path: Path | None = None) -> dict: + """ + Extract metadata (title, author, etc.) from book files. + + Fills in missing book metadata fields using extracted information from files. + + Args: + data: Book data to populate with extracted metadata. + + Returns: + The data with extracted metadata populated in empty fields. + """ + extracted_metadata = await MetadataExtractor.extract_metadata(data["files"], root_path) + + # Add missing fields and update empty (falsey) fields with extracted metadata + for attr in extracted_metadata.keys(): + if not data.get(attr, None): + data[attr] = extracted_metadata[attr] + return data + + async def _save_cover_image(self, data: dict) -> dict: + """ + Save the book's cover image to the filesystem. + + Converts uploaded images to WebP format for consistent storage and assigns + a unique UUID-based filename. + + Args: + data: Book data potentially containing a cover_image field. + + Returns: + The data with cover_image path populated or removed if not provided. + """ + if (image := data.pop("cover_image", None)) is None: + return data + + if isinstance(image, UploadFile): + content = await image.read() + image = Image.open(BytesIO(content)) + + filepath = Path(settings.book_cover_path) + filename = Path(f"{uuid.uuid4()}.webp") # Random filename + + await save_image(image, filepath / filename) + + data["cover_image"] = str(filepath / filename) + return data diff --git a/backend/src/chitai/services/book_progress.py b/backend/src/chitai/services/book_progress.py new file mode 100644 index 0000000..ece99ce --- /dev/null +++ b/backend/src/chitai/services/book_progress.py @@ -0,0 +1,17 @@ +# src/chitai/services/book_progress.py + +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository + +from chitai.database import models as m + + +class BookProgressService(SQLAlchemyAsyncRepositoryService[m.BookProgress]): + """Book progress service for managing progress operations.""" + + class Repo(SQLAlchemyAsyncRepository[m.BookProgress]): + """Book progress repository.""" + + model_type = m.BookProgress + + repository_type = Repo diff --git a/backend/src/chitai/services/bookshelf.py b/backend/src/chitai/services/bookshelf.py new file mode 100644 index 0000000..3a2ef1e --- /dev/null +++ b/backend/src/chitai/services/bookshelf.py @@ -0,0 +1,88 @@ +# src/chitai/services/bookshelf.py + +# Third-party libraries +from typing import Any, Sequence +from advanced_alchemy.exceptions import ErrorMessages +from advanced_alchemy.filters import StatementFilter +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository +from advanced_alchemy.utils.dataclass import Empty, EmptyType +from sqlalchemy import ColumnElement, Select, delete + +# Local imports +from chitai.database.models.book_list import BookList, BookListLink +from chitai.services import BookService +from chitai.services.filters.book import BookshelfFilter +from chitai.database import models as m + + +class ShelfService(SQLAlchemyAsyncRepositoryService[BookList]): + """Service for managing bookshelves and their contents.""" + + class Repo(SQLAlchemyAsyncRepository[BookList]): + """Repository for BookList entities.""" + + model_type = BookList + + repository_type = Repo + + async def add_books(self, shelf_id: int, book_ids: list[int]) -> m.BookList: + """ + Add books to the specified bookshelf. + + Creates BookListLink entries to associate books with the shelf, automatically + assigning positions based on the current shelf size. + + Args: + shelf_id: The ID of the shelf to add books to. + book_ids: List of book IDs to add. + + Raises: + ValueError: If the shelf does not exist. + """ + + shelf = await self.get(shelf_id, load=[m.BookList.book_links]) + + async with BookService.new(session=self.repository.session) as book_service: + # Verify all books exist + total = await book_service.count(m.Book.id.in_(book_ids)) + if total != len(book_ids): + raise ValueError("One or more books not found") + + # Get all books that exist on the shelf + shelf_books = await book_service.list(BookshelfFilter(lists=[shelf_id])) + + # Filter out books that are already on the shelf to avoid adding them again + existing_book_ids = [book.id for book in shelf_books] + new_book_ids = [bid for bid in book_ids if bid not in existing_book_ids] + + # Add new books + if new_book_ids: + for book_id in new_book_ids: + shelf.book_links.append(BookListLink(book_id=book_id)) + + await self.update(shelf) + + return await self.get(shelf_id, load=[m.BookList.book_links]) + + async def remove_books(self, shelf_id: int, book_ids: list[int]) -> m.BookList: + """ + Remove books from the specified bookshelf. + + Args: + shelf_id: The ID of the shelf to remove books from. + book_ids: List of book IDs to remove. + + Raises: + ValueError: If the shelf does not exist. + """ + shelf = await self.get(shelf_id, load=[BookList.book_links]) + + book_ids_set = set(book_ids) # for O(1) lookup + for i in range(len(shelf.book_links) - 1, -1, -1): + if shelf.book_links[i].book_id in book_ids_set: + shelf.book_links.pop(i) + + await self.update(shelf) + + return await self.get(shelf_id, load=[m.BookList.book_links]) diff --git a/backend/src/chitai/services/consume.py b/backend/src/chitai/services/consume.py new file mode 100644 index 0000000..5fc9b62 --- /dev/null +++ b/backend/src/chitai/services/consume.py @@ -0,0 +1,127 @@ +import asyncio +from pathlib import Path +from collections import defaultdict +from chitai.database.models.library import Library +from chitai.services import BookService, LibraryService +from chitai.services.metadata_extractor import Extractor +from chitai.services.utils import create_directory +from watchfiles import awatch, Change + +class ConsumeDirectoryWatcher: + """Watches a directory and batch processes files by their relative path.""" + + def __init__(self, watch_path: str, library_service: LibraryService, book_service: BookService, batch_delay: float = 3.0): + """ + Initialize the file watcher. + + Args: + watch_path: Directory path to watch + batch_delay: Seconds to wait before processing a batch + """ + self.watch_path = Path(watch_path).resolve() # Convert to absolute path + self.batch_delay = batch_delay + self.file_groups: dict[str, set[Path]] = defaultdict(set) + self._processing_tasks = set() + + self.book_service = book_service + self.library_service = library_service + + async def init_watcher(self): + """Background task that watches for file changes.""" + + # Create consume directories for each library if they do not exist + libraries = await self.library_service.list() + for lib in libraries: + await create_directory(Path(self.watch_path) / Path(lib.slug)) + + print(f"Starting file watcher on {self.watch_path}") + try: + async for changes in awatch(str(self.watch_path)): + for change_type, file_path in changes: + if change_type != Change.added: + continue + + file_path = Path(file_path) + + # If a directory was added, scan it for existing files + if file_path.is_dir(): + print(f"Directory added: {file_path}") + await self._handle_directory_added(file_path) + else: + print(f"File added: {file_path}") + await self._handle_file_added(file_path) + + except asyncio.CancelledError: + print("File watcher stopped") + # Wait for any pending processing tasks + if self._processing_tasks: + await asyncio.gather(*self._processing_tasks, return_exceptions=True) + raise + + async def _handle_file_added(self, file_path: Path): + """Handle a single file being added.""" + # Get relative path from watch directory + + rel_path = file_path.relative_to(self.watch_path) + parent_rel = rel_path.parent + library = parent_rel.parts[0] + + # Add to appropriate group + self.file_groups[library].add(file_path) + + # Schedule batch processing for this group + self._schedule_batch_processing(library) + + async def _handle_directory_added(self, dir_path: Path): + """Handle a directory being added - scan it for existing files.""" + try: + # Recursively find all files in the added directory + for file_path in dir_path.rglob("*"): + if file_path.is_file(): + print(f"Found existing file: {file_path}") + await self._handle_file_added(file_path) + except Exception as e: + print(f"Error scanning directory {dir_path}: {e}") + + def _schedule_batch_processing(self, library_slug: str): + """Schedule batch processing for a specific path group.""" + # Create a task to process this group after a delay + task = asyncio.create_task(self._delayed_batch_process(library_slug)) + self._processing_tasks.add(task) + task.add_done_callback(self._processing_tasks.discard) + + async def _delayed_batch_process(self, library_slug: str): + """Wait for batch delay, then process accumulated files.""" + await asyncio.sleep(self.batch_delay) + + # Get and clear the file list for this path + if library_slug not in self.file_groups: + return + + files_to_process = self.file_groups[library_slug].copy() + self.file_groups[library_slug].clear() + + if not files_to_process: + return + + print(f"Batch processing {len(files_to_process)} files from {library_slug}") + await self._process_batch(files_to_process, library_slug) + + async def _process_batch(self, file_paths: set[Path], library_slug: str): + """Process a batch of files.""" + try: + + books = await self.book_service.create_many_from_existing_files( + list(file_paths), + self.watch_path / Path(library_slug), + library=await self._get_library(library_slug), + ) + + print(f"Created {len(books)} books!") + + except Exception as e: + print(f"Error processing batch: {e}") + raise e + + async def _get_library(self, slug: str) -> Library: + return await self.library_service.get_one(Library.slug == slug) diff --git a/backend/src/chitai/services/dependencies.py b/backend/src/chitai/services/dependencies.py new file mode 100644 index 0000000..72d1e45 --- /dev/null +++ b/backend/src/chitai/services/dependencies.py @@ -0,0 +1,342 @@ +# src/chitai/services/dependencies.py + +# Standard library +from __future__ import annotations +from typing import Any, AsyncGenerator, Callable, NotRequired, Optional + +# Third-party libraries +from advanced_alchemy.extensions.litestar.providers import ( + create_service_provider, + FilterConfig, + DEPENDENCY_DEFAULTS, + DependencyDefaults, +) +from advanced_alchemy.exceptions import NotFoundError +from advanced_alchemy.filters import CollectionFilter, StatementFilter +from advanced_alchemy.service import FilterTypeT +from sqlalchemy.orm import selectinload, with_loader_criteria +from sqlalchemy.ext.asyncio import AsyncSession +from litestar import Request +from litestar.params import Dependency, Parameter +from litestar.security.jwt import Token +from litestar.exceptions import HTTPException +from litestar.di import Provide + +from advanced_alchemy.extensions.litestar.providers import create_filter_dependencies + +# Local imports +from chitai import schemas as s +from chitai.database import models as m +from chitai.services import ( + UserService, + BookService, + LibraryService, + BookProgressService, + ShelfService, + TagService, + AuthorService, + PublisherService, +) +from chitai.config import settings +from chitai.services.filters.book import ( + AuthorFilter, + BookshelfFilter, + CustomOrderBy, + ProgressFilter, + TagFilter, + TrigramSearchFilter, +) + + +async def provide_book_service( + db_session: AsyncSession, current_user: m.User | None = None +) -> AsyncGenerator[BookService, None]: + load = [ + selectinload(m.Book.author_links).selectinload(m.BookAuthorLink.author), + selectinload(m.Book.tag_links).selectinload(m.BookTagLink.tag), + m.Book.publisher, + m.Book.files, + m.Book.identifiers, + m.Book.series, + ] + + # Load in specific user-book data + if current_user: + # Load progress data + load.extend( + [ + selectinload(m.Book.progress_records), + with_loader_criteria( + m.BookProgress, m.BookProgress.user_id == current_user.id + ), + ] + ) + + # Load shelf data + load.extend( + [ + selectinload(m.Book.list_links).selectinload(m.BookListLink.book_list), + with_loader_criteria( + m.BookListLink, + m.Book.lists.any(m.BookList.user_id == current_user.id), + ), + ] + ) + + provider_func = create_service_provider( + BookService, + load=load, + uniquify=True, + error_messages={ + "integrity": "Book operation failed.", + "not_found": "The book does not exist.", + }, + config=settings.alchemy_config, + ) + + async for service in provider_func(db_session=db_session): + yield service + + +def create_book_filter_dependencies( + config: FilterConfig, + dep_defaults: DependencyDefaults = DEPENDENCY_DEFAULTS, +) -> dict[str, Provide]: + """Create filter dependencies for books, including custom progress filters. + + Overrides: + - SearchFilter: Uses trigram search for better fuzzy matching + - OrderBy: Adds "random" sort order option + + Args: + config: FilterConfig instance with desired settings. + dep_defaults: Dependency defaults to use for the filter dependencies + + Returns: + Dictionary of filter provider functions including base and custom filters. + """ + + # Get base filters first + filters = create_filter_dependencies(config, dep_defaults) + + # OVERRIDE: Custom search filter with trigram search + if config.get("search"): + search_fields = config.get("search") + + def provide_trigram_search_filter( + search_string: str | None = Parameter( + title="Field to search", + query="searchString", + default=None, + required=False, + ), + ignore_case: bool | None = Parameter( + title="Search should be case sensitive", + query="searchIgnoreCase", + default=config.get("search_ignore_case", False), + required=False, + ), + ) -> TrigramSearchFilter | None: + if not search_string: + return None + + # field_names = set(search_fields.split(",")) if isinstance(search_fields, str) else set(search_fields) + return TrigramSearchFilter( + field_name="book.title", + value=search_string, + ignore_case=ignore_case or False, + ) + + filters[dep_defaults.SEARCH_FILTER_DEPENDENCY_KEY] = Provide( + provide_trigram_search_filter, sync_to_thread=False + ) + + # OVERRIDE: Custom order by with "random" option + if config.get("sort_field"): + sort_field = config.get("sort_field") + + def provide_custom_order_by( + field_name: str | None = Parameter( + title="Order by field", + query="orderBy", + default=sort_field, + required=False, + ), + sort_order: str | None = Parameter( + title="Sort order (asc, desc, or random)", + query="sortOrder", + default=config.get("sort_order", "desc"), + required=False, + ), + current_user: m.User | None = Dependency(default=None), + ) -> CustomOrderBy | None: + if not field_name: + return None + + # Validate sort_order + valid_orders = {"asc", "desc", "random"} + if sort_order not in valid_orders: + raise ValueError(f"sort_order must be one of {valid_orders}") + + return CustomOrderBy( + field_name=field_name, sort_order=sort_order, user=current_user + ) + + filters[dep_defaults.ORDER_BY_FILTER_DEPENDENCY_KEY] = Provide( + provide_custom_order_by, sync_to_thread=False + ) + + return filters + + +def provide_libraries_filter( + library_ids: Optional[list[int]] = Parameter( + title="Filter by libraries", query="libraries", default=None, required=None + ), +) -> CollectionFilter | None: + if not library_ids: + return None + + return CollectionFilter(field_name="library_id", values=library_ids) + + +def provide_authors_filter( + author_ids: Optional[list[int]] = Parameter( + title="Filter by authors", query="authors", default=None, required=False + ), +) -> AuthorFilter | None: + if not author_ids: + return None + return AuthorFilter(authors=author_ids) + + +def provide_publishers_filter( + publisher_ids: Optional[list[int]] = Parameter( + title="Filter by publishers", query="publishers", default=None, required=False + ), +) -> CollectionFilter | None: + if not publisher_ids: + return None + return CollectionFilter(field_name="publisher_id", values=publisher_ids) + + +def provide_tags_filter( + tag_ids: Optional[list[int]] = Parameter( + title="Filter by tags", query="tags", default=None, required=False + ), +) -> TagFilter | None: + if not tag_ids: + return None + return TagFilter(tags=tag_ids) + + +def provide_bookshelves_filter( + shelf_ids: Optional[list[int]] = Parameter( + title="Filter by bookshelves", query="shelves", default=None, required=False + ), + current_user: m.User = Dependency(skip_validation=True), +) -> BookshelfFilter | None: + if not shelf_ids: + return None + return BookshelfFilter(lists=shelf_ids, user_id=current_user.id) + + +def provide_progress_filter( + progress_statuses: Optional[list[str]] = Parameter( + title="Filter by progress status", + query="progress", + default=None, + required=False, + ), + current_user: m.User = Dependency(skip_validation=True), +) -> ProgressFilter | None: + if not progress_statuses: + return None + return ProgressFilter(user_id=current_user.id, statuses=set(progress_statuses)) + + +def provide_book_filters( + libraries_filter: CollectionFilter | None = Dependency(skip_validation=True), + authors_filter: AuthorFilter | None = Dependency(skip_validation=True), + publishers_filter: CollectionFilter | None = Dependency(skip_validation=True), + tags_filter: TagFilter | None = Dependency(skip_validation=True), + bookshelves_filter: BookshelfFilter | None = Dependency(skip_validation=True), + progress_filter: ProgressFilter | None = Dependency(skip_validation=True), +) -> list[StatementFilter]: + """Combine all optional filters into a single list.""" + return [ + f + for f in [ + libraries_filter, + authors_filter, + publishers_filter, + tags_filter, + bookshelves_filter, + progress_filter, + ] + if f is not None + ] + + +provide_library_service = create_service_provider( + LibraryService, +) + +provide_user_service = create_service_provider( + UserService, + error_messages={ + "duplicate_key": "Verification token already exists.", + "integrity": "User operation failed.", + }, +) + +provide_shelf_service = create_service_provider( + ShelfService, +) + +provide_progress_service = create_service_provider( + BookProgressService, +) + +provide_tag_service = create_service_provider(TagService) + +provide_author_service = create_service_provider(AuthorService) + +provide_publisher_service = create_service_provider(PublisherService) + + +async def get_library_by_id( + library_service: LibraryService, + books_service: BookService, + library_id: int | None = None, + book_id: int | None = Dependency(), +) -> m.Library: + """Retrieves the library matching the id.""" + + if not library_id: + try: + book = await books_service.get(book_id) + library_id = book.library_id + except NotFoundError: + raise HTTPException(status_code=404, detail="The given book does not exist") + + try: + return await library_service.get(library_id) + + except NotFoundError: + raise HTTPException(status_code=404, detail="The given library does not exist") + + +def provide_user(request: Request[m.User, Token, Any]) -> m.User: + return request.user + + +def provide_optional_user(request: Request[m.User, Token, Any]) -> m.User | None: + if request.user: + return request.user + + return None + +async def provide_user_via_basic_auth(request: Request[m.User, None, Any]) -> m.User: + return request.user + \ No newline at end of file diff --git a/backend/src/chitai/services/filesystem_library.py b/backend/src/chitai/services/filesystem_library.py new file mode 100644 index 0000000..dfde73d --- /dev/null +++ b/backend/src/chitai/services/filesystem_library.py @@ -0,0 +1,135 @@ +# src/chitai/services/filesystem_library.py + +from pathlib import Path +import re + +from jinja2 import Template +from advanced_alchemy.service import ModelDictT + +import chitai.database.models as m + +# TODO: Replace Jinja2 templates with a simpler custom templating system. +# Current Jinja2 implementation is overly complex for basic path generation. +# Consider a simpler approach: +# - Use simple placeholder syntax: {author}/{series}/{series_position} - {title} +# - Support only essential variables: {author}, {series}, {series_position}, {title}, {isbn} +# - Auto-handle missing values (e.g., skip {series}/ if series is empty) + + +default_path_template = """ +/{{book.authors[0] if book.authors else 'Unknown'}} +{%- if book.series -%} +/{{book.series}} +{%- endif -%} +{%- if book.series_position -%} +{%- set formatted_position = '{:04.1f}'.format(book.series_position|float) -%} +/{{formatted_position.rstrip('0').rstrip('.')}} - {{book.title}} +{%- else %}/{{book.title}} +{% endif -%} +""" + + +class BookPathGenerator: + """ + Generates organized filesystem paths for books based on customizable Jinja2 templates. + + Uses book metadata (author, series, title, etc.) to organize books into a hierarchical + directory structure. Supports separate templates for the directory path and filename. + + """ + + def __init__( + self, + root_path: Path | str, + path_template: str = default_path_template, + filename_template: str | None = None, + ) -> None: + """ + Initialize the path generator with templates. + + Args: + root_path: The base filesystem path where books will be organized. + path_template: Jinja2 template string for directory structure. + Default organizes by author, series, and title. + filename_template: Optional Jinja2 template for custom filenames. + If None, original filenames are preserved. + """ + self.root_path = Path(root_path) + self.path_template: Template = Template(path_template) + self.filename_template = ( + Template(filename_template) if filename_template else None + ) + + def generate_full_path(self, book_data: dict, filename: Path | str) -> Path: + """ + Generate the complete filesystem path including directory structure and filename. + + Combines the generated book directory path with the generated filename to produce + the full path where a book file should be stored. This is the complete path + relative to the generator's root path. + + Args: + book_data: Dictionary containing book metadata (author, title, series, etc.). + filename: The original filename or Path object to transform. + + Returns: + Complete relative Path including directory structure and filename. + """ + + return self.generate_path(book_data) / self.generate_filename( + book_data, filename + ) + + def generate_path(self, book_data: dict) -> Path: + """ + Generate the organized directory path for a book based on its metadata. + + Uses the path template to create a hierarchical structure. Handles edge cases like + missing authors (defaults to 'Unknown'), optional series information, and series + position formatting. Sanitizes the result by removing consecutive slashes and + unnecessary whitespace. + + Args: + book_data: Dictionary containing book metadata with keys like: + - authors: List of author names + - series: Series name (optional) + - series_position: Position in series (optional) + - title: Book title + + Returns: + Cleaned Path object relative to the generator's root path. + + """ + + result = self.root_path / Path(self.path_template.render(book=book_data)) + + # Clean up + result = re.sub(r"/+", "/", str(result)) # Remove consecutive backslashes + result = re.sub(r"/\s+", "/", result) # Remove whitespace after backslashes + return Path(result.strip()) + + def generate_filename(self, book_data: dict, filename: Path | str) -> Path: + """ + Generate or transform a filename based on book metadata. + + If a filename template is configured, uses it to generate a custom filename + based on book metadata. Otherwise, returns the original filename unchanged. + + Args: + book_data: Dictionary containing book metadata. + filename: The original filename or Path object to transform. + + Returns: + The generated or original filename as a Path object. + + Raises: + jinja2.TemplateError: If the filename template contains invalid Jinja2 syntax. + + """ + filename = Path(filename) + + # TODO: Implement a filename template. + # For now just returns the original filename + if self.filename_template: + ... + return Path(filename) diff --git a/backend/src/chitai/services/filters/author.py b/backend/src/chitai/services/filters/author.py new file mode 100644 index 0000000..13ca0a7 --- /dev/null +++ b/backend/src/chitai/services/filters/author.py @@ -0,0 +1,32 @@ +from typing import Any, Optional +from dataclasses import dataclass + +from advanced_alchemy.filters import ( + StatementTypeT, + StatementFilter, + ModelT, +) + +from chitai.database import models as m +from sqlalchemy import select + + +@dataclass +class AuthorLibraryFilter(StatementFilter): + """Filter authors by library_id - returns authors with at least one book in the library.""" + + libraries: Optional[list[int]] = None + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.libraries: + statement = statement.where( + m.Author.id.in_( + select(m.BookAuthorLink.author_id) + .join(m.Book) + .where(m.Book.library_id.in_(self.libraries)) + ) + ) + + return super().append_to_statement(statement, model, *args, **kwargs) diff --git a/backend/src/chitai/services/filters/book.py b/backend/src/chitai/services/filters/book.py new file mode 100644 index 0000000..9acaccc --- /dev/null +++ b/backend/src/chitai/services/filters/book.py @@ -0,0 +1,241 @@ +from enum import StrEnum +from typing import Any, Optional +from dataclasses import dataclass, field + +from sqlalchemy.orm import aliased +from sqlalchemy import Select, and_, desc, func, or_, text +from advanced_alchemy.filters import ( + StatementTypeT, + StatementFilter, + CollectionFilter, + ModelT, +) + +from chitai.database import models as m + + +@dataclass +class TagFilter(StatementFilter): + """Filters for books containing at least one of the tags.""" + + tags: Optional[list[int]] + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.tags: + statement = statement.where(m.Book.tags.any(m.Tag.id.in_(self.tags))) + + return super().append_to_statement(statement, model, *args, **kwargs) + + +@dataclass +class AuthorFilter(StatementFilter): + """Filters for books by any of the given authors.""" + + authors: Optional[list[int]] + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.authors: + statement = statement.where( + m.Book.authors.any(m.Author.id.in_(self.authors)) + ) + + return super().append_to_statement(statement, model, *args, **kwargs) + + +@dataclass +class BookshelfFilter(StatementFilter): + """Filters for books in the given bookshelves.""" + + lists: Optional[list[int]] + user_id: Optional[int] = None + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.lists: + if self.user_id: + statement = statement.where( + m.Book.lists.any( + and_( + m.BookList.user_id == self.user_id, + m.BookList.id.in_(self.lists), + ) + ) + ) + + else: + statement = statement.where( + m.Book.lists.any(m.BookList.id.in_(self.lists)) + ) + + return super().append_to_statement(statement, model, *args, **kwargs) + + +class ProgressStatus(StrEnum): + """Enum for different progress statuses.""" + + IN_PROGRESS = "in_progress" + READ = "read" + UNREAD = "unread" + + +@dataclass +class ProgressFilter(StatementFilter): + """ + Filters books based on their progress status. + + Supports filtering completed, in progress, and unread books. + + """ + + user_id: int + statuses: set[ProgressStatus] = field(default_factory=set) + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args: Any, **kwargs: Any + ) -> StatementTypeT: + if not isinstance(statement, Select) or not self.statuses: + return super().append_to_statement(statement, model, *args, **kwargs) + + # Check if UNREAD is the only status or part of the filter + has_unread = ProgressStatus.UNREAD in self.statuses + has_other_statuses = bool(self.statuses - {ProgressStatus.UNREAD}) + + # If only filtering by UNREAD, use a simpler query + if has_unread and not has_other_statuses: + statement = statement.outerjoin( + m.BookProgress, + and_( + m.BookProgress.book_id == model.id, + m.BookProgress.user_id == self.user_id, + ), + ).where(m.BookProgress.id.is_(None)) + return super().append_to_statement(statement, model, *args, **kwargs) + + # For other statuses, build the where clause + statement = statement.outerjoin( + m.BookProgress, + and_( + m.BookProgress.book_id == model.id, + m.BookProgress.user_id == self.user_id, + ), + ).where(self._build_where_clause()) + + return super().append_to_statement(statement, model, *args, **kwargs) + + def _build_where_clause(self) -> Any: + """Build the appropriate where clause based on the status.""" + status_conditions = [] + + if ProgressStatus.IN_PROGRESS in self.statuses: + status_conditions.append( + and_( + or_( + m.BookProgress.completed == False, + m.BookProgress.completed.is_(None), + ), + m.BookProgress.progress > 0, + ) + ) + + if ProgressStatus.READ in self.statuses: + status_conditions.append(m.BookProgress.completed == True) + + if ProgressStatus.UNREAD in self.statuses: + status_conditions.append(m.BookProgress.id.is_(None)) + + return or_(*status_conditions) + + +@dataclass +class FileFilter(StatementFilter): + """Filter books that are related to the given files.""" + + file_ids: list[int] + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args: Any, **kwargs: Any + ) -> StatementTypeT: + statement = statement.where( + m.Book.files.any(m.FileMetadata.id.in_(self.file_ids)) + ) + + return super().append_to_statement(statement, model, *args, **kwargs) + + +@dataclass +class CustomOrderBy(StatementFilter): + """Order by filter with support for 'random' and 'last accessed' orderings.""" + + field_name: str + sort_order: str = "desc" + user: m.User | None = None + + def append_to_statement( + self, statement: Any, model: type[Any], *args: Any, **kwargs: Any + ) -> Any: + if not isinstance(statement, Select): + return super().append_to_statement(statement, model, *args, **kwargs) + + # Sort randomly + if self.sort_order == "random": + statement = statement.order_by(func.random()) + + # Sort by BookProgress.updated_at for the current user + elif self.field_name == "last_accessed": + if self.user: + BP = aliased(m.BookProgress) + statement = statement.outerjoin( + BP, (BP.book_id == model.id) & (BP.user_id == self.user.id) + ) + order_column = BP.updated_at + if self.sort_order == "asc": + statement = statement.order_by(order_column.asc().nullslast()) + else: + statement = statement.order_by(order_column.desc().nullslast()) + else: + # Skip sorting if no user provided + return statement + + # Sort by a regular field + else: + field = getattr(model, self.field_name, None) + if field is not None: + if self.sort_order == "asc": + statement = statement.order_by(field.asc()) + else: + statement = statement.order_by(field.desc()) + + return super().append_to_statement(statement, model, *args, **kwargs) + + +@dataclass +class TrigramSearchFilter(StatementFilter): + """Custom search filter using PostgreSQL trigram similarity for fuzzy matching.""" + + field_name: str + value: str + ignore_case: bool = False + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args: Any, **kwargs: Any + ) -> StatementTypeT: + if not isinstance(statement, Select): + return super().append_to_statement(statement, model, *args, **kwargs) + + statement = statement.where( + or_( + text("books.title % :term").bindparams(term=self.value), + m.Book.title.ilike(f"%{self.value}%"), + ) + ).order_by( + text("greatest(similarity(books.title, :term)) DESC").bindparams( + term=self.value + ) + ) + + return super().append_to_statement(statement, model, *args, **kwargs) diff --git a/backend/src/chitai/services/filters/publisher.py b/backend/src/chitai/services/filters/publisher.py new file mode 100644 index 0000000..4b1ed58 --- /dev/null +++ b/backend/src/chitai/services/filters/publisher.py @@ -0,0 +1,28 @@ +from typing import Optional +from dataclasses import dataclass + +from advanced_alchemy.filters import ( + StatementTypeT, + StatementFilter, + ModelT, +) + +from chitai.database import models as m + + +@dataclass +class PublisherLibraryFilter(StatementFilter): + """Filter authors by library_id - returns publishers with at least one book in the library.""" + + libraries: Optional[list[int]] = None + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.libraries: + statement = statement.where( + m.Book.publisher_id == m.Publisher.id, + m.Book.library_id.in_(self.libraries), + ) + + return super().append_to_statement(statement, model, *args, **kwargs) diff --git a/backend/src/chitai/services/filters/tags.py b/backend/src/chitai/services/filters/tags.py new file mode 100644 index 0000000..40adfa1 --- /dev/null +++ b/backend/src/chitai/services/filters/tags.py @@ -0,0 +1,31 @@ +from typing import Optional +from dataclasses import dataclass + +from advanced_alchemy.filters import ( + StatementTypeT, + StatementFilter, + ModelT, +) + +from chitai.database import models as m +from sqlalchemy import select + + +@dataclass +class TagLibraryFilter(StatementFilter): + """Filter tags by library_id - returns tags with at least one book in the library.""" + + libraries: Optional[list[int]] = None + + def append_to_statement( + self, statement: StatementTypeT, model: type[ModelT], *args, **kwargs + ) -> StatementTypeT: + if self.libraries: + statement = statement.where( + m.Tag.id.in_( + select(m.BookTagLink.tag_id) + .join(m.Book) + .where(m.Book.library_id.in_(self.libraries)) + ) + ) + return super().append_to_statement(statement, model, *args, **kwargs) diff --git a/backend/src/chitai/services/library.py b/backend/src/chitai/services/library.py new file mode 100644 index 0000000..10cdeeb --- /dev/null +++ b/backend/src/chitai/services/library.py @@ -0,0 +1,134 @@ +# src/chitai/services/library.py + +# Third-party libraries +from pathlib import Path +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository +from advanced_alchemy import service +from advanced_alchemy.utils.text import slugify + +# Local imports +from chitai.database.models.library import Library +from chitai.schemas.library import LibraryCreate, LibraryUpdate +from chitai.services.utils import ( + DirectoryDoesNotExist, + create_directory, + directory_exists, +) + +from chitai.config import settings + +class LibraryService(SQLAlchemyAsyncRepositoryService[Library]): + """Service for managing libraries and their configuration.""" + + class Repo(SQLAlchemyAsyncRepository[Library]): + """Repository for Library entities.""" + + model_type = Library + + repository_type = Repo + + async def create(self, library: LibraryCreate, **kwargs) -> Library: + """ + Create a new library and initialize its filesystem structure. + + For writable libraries, creates the root directory and any missing parent directories. + For read-only libraries, validates that the root directory already exists. + + Args: + library: The library configuration to create. + **kwargs: Additional keyword arguments passed to parent create. + + Returns: + The created Library entity. + + Raises: + DirectoryDoesNotExist: If a read-only library's root directory does not exist. + OSError: If directory creation fails due to filesystem issues. + """ + + # TODO: What if a library root_path is a child of an existing library? + if existing := await self.list(Library.root_path == library.root_path): + raise ValueError(f"Library already exists at '{library.root_path}'") + + if library.read_only: + # Validate read-only library directory exists + if not await directory_exists(library.root_path): + raise DirectoryDoesNotExist( + f"Root directory '{library.root_path}' must exist for a read-only library" + ) + + + # TODO: Verify the read-only library has read permissions + created_library = await super().create( + service.schema_dump(library, exclude_unset=False), **kwargs + ) + + if not library.read_only: + # Create directory for writable libraries + await create_directory(library.root_path) + # Create a consume directory + await create_directory(Path(settings.consume_path) / Path(library.slug)) + + return created_library + + + + + # TODO: Implement library deletion and optional file deletion + async def delete( + self, item_id: int, delete_files: bool = False, **kwargs + ) -> Library: + """ + Delete a library and optionally delete its associated files from the filesystem. + + For writable libraries, can optionally delete the root directory and all its contents. + Read-only libraries cannot have their files deleted through this method, as they are + typically external or managed elsewhere. + + Args: + item_id: The ID of the library to delete. + delete_files: If True, delete the library's root directory and all files. + Cannot be True for read-only libraries. Defaults to False. + **kwargs: Additional keyword arguments passed to parent delete method. + + Returns: + The deleted Library entity. + + Raises: + ValueError: If delete_files=True is specified for a read-only library. + DirectoryDoesNotExist: If the library's root directory does not exist when attempting + to delete files. + OSError: If file deletion fails due to filesystem errors. + + """ + raise NotImplementedError() + + async def update( + self, + data: LibraryUpdate, + item_id: int | None = None, + **kwargs, + ) -> Library: + """ + Update a library's configuration and optionally move its files to a new root path. + + If the root_path is being changed and the library is not read-only, migrates all + associated book files to the new location. Read-only libraries cannot have their + files moved, and attempting to change their root_path will raise an error. + + Args: + item_id: The ID of the library to update. + data: LibraryUpdate configuration with updated library fields. + **kwargs: Additional keyword arguments passed to parent update method. + + Returns: + The updated Library entity. + + Raises: + ValueError: If attempting to change root_path for a read-only library. + DirectoryDoesNotExist: If the current library root directory does not exist + when attempting to migrate files. + OSError: If file migration fails due to filesystem errors. + """ + raise NotImplementedError() diff --git a/backend/src/chitai/services/metadata_extractor.py b/backend/src/chitai/services/metadata_extractor.py new file mode 100644 index 0000000..f6b1fc8 --- /dev/null +++ b/backend/src/chitai/services/metadata_extractor.py @@ -0,0 +1,533 @@ +# src/chitai/services/metadata_extractor.py + +# TODO: Code is a mess. Clean it up and add docstrings + +# Standard library +from abc import ABC, abstractmethod +import datetime +from pathlib import Path +from io import BytesIO +import re +from tempfile import SpooledTemporaryFile +from typing import Any, Protocol, BinaryIO +import logging + +# Third-party libraries +import PIL +import PIL.Image +from litestar.datastructures import UploadFile +import pypdfium2 +import ebooklib +from ebooklib import epub + +# Local imports +from chitai.services.utils import ( + create_temp_file, + get_file_extension, + get_filename, + is_valid_isbn, +) + +logger = logging.getLogger(__name__) + + +class FileExtractor(Protocol): + @classmethod + async def extract_metadata( + cls, input: UploadFile | BinaryIO | bytes | Path | str + ) -> dict[str, Any]: ... + + @classmethod + async def extract_text(cls, input: UploadFile | BinaryIO | bytes | Path | str) -> str: ... + + +class Extractor: + """Default extractor class that delegates to the proper extractor based on file type.""" + + format_priorities = {"epub": 1, "pdf": 2} + + @classmethod + async def extract_metadata(cls, files: list[UploadFile] | list[Path], root_path: Path | None = None) -> dict[str, Any]: + metadata = {} + + # Sort based on file priority + # EPUB tends to give better metadata results over pdf + sorted_files = sorted(files, key=lambda f: Extractor._get_file_priority(f)) + + for file in sorted_files: + match get_file_extension(file): + case "epub": + metadata = metadata | await EpubExtractor.extract_metadata(file) + case "pdf": + metadata = metadata | await PdfExtractor.extract_metadata(file) + case _: + break + + # Get metadata from file names + for file in files: + metadata = FilenameExtractor.extract_metadata(file) | metadata + + # Get metadata from filepath + metadata = metadata | FilepathExtractor.extract_metadata(files[0], root_path) + + # format the title + if metadata.get('title', None): + title, subtitle = Extractor.format_book_title(metadata["title"]) + metadata["title"] = title + metadata["subtitle"] = subtitle + + return metadata + + @classmethod + async def extract_text(cls, input: BinaryIO | bytes | Path | str) -> str: ... + + @classmethod + def format_book_title(cls, title: str) -> tuple[str, str | None]: + # Convert all trailing underscores to colons + title = Extractor.convert_underscores_to_colons(title) + + colon_count = title.count(":") + + if colon_count < 2: + return title, None # No subtitle + + # There is a subtitle, split the string at the second colon (colon is disregarded) + first_colon_idx = title.find(":") + second_colon_idx = title.find( + ":", first_colon_idx + 1 + ) # Start search after first colon + + return (title[:second_colon_idx], title[second_colon_idx + 1 :]) + + @classmethod + def _get_file_priority(cls, upload: UploadFile | Path) -> float: + + filename = "" + if isinstance(upload, UploadFile): + filename = Path(upload.filename) + elif isinstance(upload, Path): + filename = upload.name + + file_ext = get_file_extension(filename) + + if file_ext is None: + return float('inf') + + return Extractor.format_priorities.get(file_ext, float("inf")) + + @classmethod + def convert_underscores_to_colons(cls, text: str) -> str: + """ + Converts underscores that trail a word and are followed by a space and another word to colons. + Only converts when there's a space between words. + + For example: + - "hello_ world" -> "hello: world" + - "this_ is_ a_ test" -> "this: is: a: test" + - "hello_world" -> "hello_world" (unchanged, no space) + - "word_" -> "word_" (unchanged, no following word) + + Args: + text (str): The input text to be processed + + Returns: + str: The processed text with underscores converted to colons + """ + # This pattern matches a word followed by underscore(s), followed by a space, followed by another word + pattern = r"(\w+)(_+)(\s+)(\w+)" + + # Replace all occurrences with word1: word2 (preserving the space) + result = re.sub(pattern, r"\1:\3\4", text) + + return result + + +class PdfExtractor(FileExtractor): + """Extract metadata and text from a PDF file.""" + + @classmethod + async def extract_metadata( + cls, data: UploadFile | SpooledTemporaryFile | BinaryIO | bytes | Path | str + ) -> dict[str, Any]: + """Extracts metadata from a PDF file.""" + metadata = {} + + if isinstance(data, UploadFile): + data = data.file + + doc = pypdfium2.PdfDocument(data) + + basic_metadata = doc.get_metadata_dict(skip_empty=False) + metadata["title"] = basic_metadata["Title"] + metadata["authors"] = PdfExtractor._parse_authors(basic_metadata["Author"]) + metadata["pages"] = len(doc) + # Use the documents creation date as a guess for the date published + metadata["published_date"] = PdfExtractor._parse_pdf_date( + basic_metadata["CreationDate"] + ) + metadata["cover_image"] = PdfExtractor._extract_cover(doc) + + text_by_page = PdfExtractor._extract_text_from_pages(doc, 6) + metadata["identifiers"] = PdfExtractor._extract_isbns("".join(text_by_page)) + + doc.close() + + return {key: val for key, val in metadata.items() if val} # Remove empty values + + @classmethod + async def extract_text(cls, data: BinaryIO | bytes | Path | str) -> str: + raise NotImplementedError() # TODO: Implement text extraction from PDF files + + @classmethod + def _parse_authors(cls, author_string: str): + """Extracts author data from the authors string based on common formats.""" + + # Remove trailing delimiters and whitespace + author_string = author_string.strip("; &").strip() + + if not author_string: + return [] + + try: + # Determine the format based on presence of commas + if "," in author_string: + # Handle LastName, FirstName; LastName, FirstName format + authors = [a.strip() for a in author_string.split(";") if a.strip()] + formatted_authors = [] + for author in authors: + last_name, first_name = [name.strip() for name in author.split(",")] + formatted_authors.append(f"{first_name} {last_name}") + elif "&" in author_string: + # Handle FirstName LastName & FirstName LastName format + authors = [a.strip() for a in author_string.split("&") if a.strip()] + formatted_authors = authors + + elif ";" in author_string: + # Handle FirstName LastName; FirstName LastName format + authors = [a.strip() for a in author_string.split(";") if a.strip()] + formatted_authors = authors + + else: + return [author_string] + + return formatted_authors + + except Exception: + return [] + + @classmethod + def _parse_pdf_date(cls, date_string: str | None) -> datetime.date | None: + if date_string is None: + return None + + # Remove "D:" prefix if present + if date_string.startswith("D:"): + date_string = date_string[2:] + + # Extract just the date portion (YYYYMMDD) and parse it + date_portion = date_string[:8] # Just take first 8 characters (YYYYMMDD) + try: + return datetime.datetime.strptime(date_portion, "%Y%m%d").date() + + except Exception as e: + return None + + @classmethod + def _extract_text_from_pages(cls, doc: pypdfium2.PdfDocument, num_pages=5): + num_pages = min(num_pages, len(doc)) + + text_by_page = [] + + for i in range(num_pages): + text_by_page.append(doc[i].get_textpage().get_text_bounded()) + + return text_by_page + + @classmethod + def _extract_isbns(cls, text: str) -> dict[str, str]: + isbn_pattern = ( + r"(\b\d{9}[\dXx]\b|\b\d{1,5}-?\d{1,7}-?\d{1,6}-?\d{1,6}-?[\dXx]\b)" + ) + + isbns = {} + + matches = re.findall(isbn_pattern, text) + for match in matches: + # Strip hyphens if present + isbn = match.replace("-", "") + + if not is_valid_isbn(isbn): + continue + + if len(isbn) == 10: + isbns.update({"isbn-10": isbn}) + elif len(isbn) == 13: + isbns.update({"isbn-13": isbn}) + + if len(isbns) >= 2: # Exit after both isbns have been matched + break + + return isbns + + @classmethod + def _extract_cover(cls, doc: pypdfium2.PdfDocument) -> PIL.Image.Image | None: + page = doc[0] + bitmap: pypdfium2.PdfBitmap = page.render() + image = bitmap.to_pil() + return image + + +class EpubExtractor(FileExtractor): + """Extract metadata and text from an EPUB file.""" + + @classmethod + async def extract_metadata( + cls, input: UploadFile | BinaryIO | bytes | Path | str + ) -> dict[str, Any]: + """Extract metadata from an EPUB file. + + Args: + input: Can be an UploadFile, file-like object, bytes, Path, or string path + + Returns: + Dictionary containing extracted metadata + """ + + # Handle different input types + if isinstance(input, UploadFile): + await input.seek(0) + data = await input.read() + path = await create_temp_file(data) + elif isinstance(input, bytes): + path = await create_temp_file(input) + elif isinstance(input, BinaryIO): + input.seek(0) + data = input.read() + path = await create_temp_file(data) + elif isinstance(input, (Path, str)): + path = Path(input) if isinstance(input, str) else input + else: + raise TypeError(f"Unsupported input type: {type(input)}") + + try: + metadata = EpubExtractor._get_metadata(path) + except Exception as e: + logger.error(f"Error extracting metadata from epub: {e}") + return {} + return metadata + + @classmethod + def extract_text(cls, input: BinaryIO | bytes | Path | str) -> str: + raise NotImplementedError() # TODO: Implement text extraction from EPUB files + + @classmethod + def _get_metadata(cls, file_path) -> dict[str, Any]: + """Uses ebooklib to extract metadata from an EPUB file. + + TODO: Some EPUBs fail to parse due to missing files, this is an issue with ebooklib; + more info and possible solution here: https://github.com/aerkalov/ebooklib/issues/281 + """ + book = epub.read_epub(file_path) + metadata = {} + + metadata["title"] = book.get_metadata("DC", "title")[0][0] + metadata["identifiers"] = EpubExtractor._extract_identifiers(book) + metadata["language"] = book.get_metadata("DC", "language")[0][0] + metadata["published_date"] = EpubExtractor._extract_published_date(book) + metadata["description"] = EpubExtractor._extract_description(book) + metadata["publisher"] = EpubExtractor._extract_publisher(book) + metadata["authors"] = EpubExtractor._extract_authors(book) + metadata["cover_image"] = EpubExtractor._extract_cover(book) + + metadata = { + key: val for key, val in metadata.items() if val + } # Remove all empty values + + return metadata + + @classmethod + def _extract_authors(cls, epub: epub.EpubBook) -> list[str]: + authors = [] + + for creator in epub.get_metadata("DC", "creator"): + authors.append(creator[0]) + + return authors + + @classmethod + def _extract_identifiers(cls, epub: epub.EpubBook) -> dict[str, str]: + identifiers = {} + + for id in epub.get_metadata("DC", "identifier"): + if is_valid_isbn(id[0]): + if len(id[0]) == 13: + identifiers.update({"isbn-13": id[0]}) + + elif len(id[0]) == 10: + identifiers.update({"isbn-10": id[0]}) + + return identifiers + + @classmethod + def _extract_description(cls, epub: epub.EpubBook) -> str | None: + try: + return epub.get_metadata("DC", "description")[0][0] + + except: + return None + + @classmethod + def _extract_published_date(cls, epub: epub.EpubBook) -> datetime.date | None: + try: + date_str = epub.get_metadata("DC", "date")[0][0].split("T")[0] + return datetime.date.fromisoformat(date_str) + + except: + return None + + @classmethod + def _extract_publisher(cls, epub: epub.EpubBook) -> str | None: + try: + epub.get_metadata("DC", "publisher")[0][0] + + except: + return None + + @classmethod + def _extract_cover(cls, epub: epub.EpubBook) -> PIL.Image.Image | None: + """Extract cover image from EPUB.""" + + # Strategy 1: Check for cover metadata (most common) + try: + cover_meta = epub.get_metadata("OPF", "cover") + if cover_meta: + # Try to get the cover ID from metadata + for meta in cover_meta: + if isinstance(meta, tuple) and len(meta) > 1: + # Handle both dict and direct string references + cover_id = ( + meta[1].get("content") + if isinstance(meta[1], dict) + else meta[1] + ) + if cover_id: + cover_item = epub.get_item_with_id(cover_id) + if cover_item: + return PIL.Image.open(BytesIO(cover_item.content)) + except Exception as e: + pass # Fallback to next strategy + + # Strategy 2: Search image filenames for "cover" keyword + images = list(epub.get_items_of_type(ebooklib.ITEM_IMAGE)) + for image in images: + filename = ( + str(image.get_name()).casefold() + if hasattr(image, "get_name") + else str(image).casefold() + ) + if "cover" in filename: + return PIL.Image.open(BytesIO(image.content)) + + return None + + +class FilepathExtractor(FileExtractor): + """Extracts metadata from the filepath.""" + + @classmethod + def extract_metadata(cls, input: UploadFile | Path | str, root_path: Path | None = None) -> dict[str, Any]: + + if isinstance(input, UploadFile): + path = Path(input.filename).parent + else: + path = Path(input).parent + + if root_path: + path = path.relative_to(root_path) + + parts = path.parts + metadata: dict[str, str | None] = {} + + if len(parts) == 3: + # Format: Author/Series/Part - Title/filename + metadata['author'] = parts[0] + + # Extract part number and title from directory name (parts[2]) + dirname = parts[2] + match = re.match(r'^([\d.]+)\s*-\s*(.+)$', dirname) + + if match: + metadata['series_position'] = match.group(1) # Keep as string + metadata['series'] = parts[1] + metadata['title'] = match.group(2).strip() + else: + metadata['series'] = parts[1] + metadata['title'] = path.stem + + elif len(parts) == 2: + # Format: Author/Title + metadata['author'] = parts[0] + metadata['title'] = path.stem # Remove extension + + return metadata + +class FilenameExtractor(FileExtractor): + """Extracts metadata from the filename.""" + + @classmethod + def extract_metadata(cls, input: Path | str | UploadFile) -> dict[str, Any]: + + if isinstance(input, str): + filename = get_filename(Path(input), ext=False) + elif isinstance(input, Path): + filename = get_filename(input, ext=False) + elif isinstance(input, UploadFile): + filename = Path(input.filename).name + else: + raise ValueError("Input type not supported") + + # Common patterns to split title and authors + patterns = [ + r"^(.+?)\s*[-–]\s*([^-–]+)$", # Pattern with hyphen separator + r"^(.+?)\s*by\s+([^-–]+)$", # Pattern with "by" separator + r"^([^:]+):\s*(.+)$", # Pattern with colon separator + ] + + title = filename + authors_str = "" + + # Try each pattern until we find a match + for pattern in patterns: + match = re.match(pattern, filename, re.IGNORECASE) + if match: + title, authors_str = match.groups() + break + + # Clean up title + title = re.sub(r"\s*\d+[^a-zA-Z]+.*$", "", title) # Remove edition numbers + title = re.sub(r"\s*\([^)]*\)", "", title) # Remove parentheses + title = title.strip() + + # Parse authors + authors = [] + if authors_str: + # Split on common author separators + author_parts = re.split(r"[,_]|\sand\s|\s&\s", authors_str) + + for author in author_parts: + # Clean up each author name + author = author.strip() + if author: + # Remove any remaining parenthetical content + author = re.sub(r"\s*\([^)]*\)", "", author) + # Remove titles and other common prefixes + author = re.sub( + r"^(MD\.Dr\.|Mr\.|Mrs\.|Ms\.|Prof\.)\s+", "", author + ) + authors.append(author.strip()) + + return {"title": title, "authors": authors} + + @classmethod + def extract_text(cls, input: Path | str): + raise NotImplementedError() # Obviously can't extract text from filename... diff --git a/backend/src/chitai/services/opds/models.py b/backend/src/chitai/services/opds/models.py new file mode 100644 index 0000000..a998980 --- /dev/null +++ b/backend/src/chitai/services/opds/models.py @@ -0,0 +1,178 @@ +from dataclasses import dataclass +from enum import StrEnum +from typing import Any, Literal, Optional, Sequence +from pydantic import BaseModel, Field +from datetime import datetime + +class LinkTypes(StrEnum): + NAVIGATION = "application/atom+xml;profile=opds-catalog;kind=navigation" + ACQUISITION = "application/atom+xml;profile=opds-catalog;kind=acquisition" + OPEN_SEARCH = "application/opensearchdescription+xml" + +class AcquisitionRelations(StrEnum): + _BASE = "http://opds-spec.org/acquisition" + + ACQUISITION = _BASE # A generic relation that indicates that the entry may be retrieved + OPEN_ACCESS = f"{_BASE}/open-access" # Entry may be retrieved without any requirement + BORROW = f"{_BASE}/borrow" # Entry may be retrieved as part of a lending transaction + BUY = f"{_BASE}/buy" # Entry may be retrieved as part of a purchase + SAMPLE = f"{_BASE}/sample" # Subset of the entry may be retrieved + PREVIEW = f"{_BASE}/preview" # Subset of the entry may be retrieved + SUBSCRIBE = f"{_BASE}/subscribe" # Entry my be retrieved as a part of a subscription + +class NavigationRelations(StrEnum): + _BASE = "" + +class LinkRelations(StrEnum): + """ Link types for OPDSv1.2 related resources + + https://specs.opds.io/opds-1.2.html#6-additional-link-relations + """ + + _BASE = "http://opds-spec.org" + + START = "start" # The OPDS catalog root + SUBSECTION = "subsection" # an OPDS feed not better described by any of the below relations + SHELF = f"{_BASE}/shelf" # Entries acquired by the euser + SUBSCRIPTIONS = f"{_BASE}/subscriptions" # Entries available with users's subscription + NEW = f"{_BASE}/sort/new" # Newest entries + POPULAR = f"{_BASE}/sort/popular" # Most popular entries + FEATURED = f"{_BASE}/featured" # Entries selected for promotion + RECOMMENDED = f"{_BASE}/recommended" # Entries recommended to the specific user + + + + +class Feed(BaseModel): # OPDS Catalog root element + xmlns: Literal["http://www.w3.org/2005/Atom"] = Field( + default="http://www.w3.org/2005/Atom", serialization_alias="@xmlns" + ) + id: str + link: list["Link"] + title: str + updated: datetime + author: Optional["Author"] = None + entry: list["Entry"] = Field(default_factory=list) + + def model_dump(self, **kwargs) -> dict: + data = super().model_dump(**kwargs) + return {"feed": data} + + +class NavigationFeed(Feed): ... + + +class AcquisitionFeed(Feed): + xmlns_dc: str | None = Field( + default="http://purl.org/dc/terms/", serialization_alias="@xmlns:dc" + ) + xmlns_opds: str | None = Field( + default="http://opds-spec.org/2010/catalog", serialization_alias="@xmlns:opds" + ) + + +class Link(BaseModel): + rel: str = Field(serialization_alias="@rel") + href: str = Field(serialization_alias="@href") + type: str = Field(serialization_alias="@type") + title: str | None = Field(default=None, serialization_alias="@title") + + +class AcquisitionLink(Link): + rel: str = Field( + default=AcquisitionRelations.OPEN_ACCESS, serialization_alias="@rel" + ) + + +class ImageLink(Link): + rel: str = Field(default="http://opds-spec.org/image", serialization_alias="@rel") + + +class Author(BaseModel): + name: str + uri: str | None = None + + +class AtomCategory(BaseModel): + # https://datatracker.ietf.org/doc/html/rfc4287#section-4.2.2 + + # MUST have a term attribute + term: str = Field() # The category to which the entry or feed belongs to + + # MAY have scheme and label attributes + scheme: str | None = Field( + default=None, serialization_alias="@scheme" + ) # IRI that identifies a categorization scheme + label: str | None = Field( + default=None, serialization_alias="@label" + ) # Human readable label for display in end-user applications + + +class AcquisitionFeedLink(Link): + rel: str = Field(default=LinkRelations.SUBSECTION, serialization_alias="@rel") + type: str = Field( + default=LinkTypes.ACQUISITION, + serialization_alias="@type", + ) + + +class NavigationFeedLink(Link): + type: str = Field( + default=LinkTypes.NAVIGATION, serialization_alias="@type" + ) + +class Content(BaseModel): + type: Literal["text"] = Field(default="text", serialization_alias="@type") + text: str = Field(serialization_alias="#text") + + +class Summary(BaseModel): + type: Literal["text"] = Field(default="text", serialization_alias="@type") + text: str = Field(serialization_alias="#text") + + +class Entry(BaseModel): + # https://specs.opds.io/opds-1.2.html#5-opds-catalog-entry-documents + + # TODO Follow for RFC 3339 date formats + + # MUST have these fields + id: str + title: str + updated: datetime = Field(default_factory=datetime.now) + + # SHOULD have these fields + dc_identifier: list[str] | None = Field( + default=None, serialization_alias="dc:identifier" + ) + dc_issued: str | None = Field( + default=None, serialization_alias="dc:issued" + ) # Publication date of the book + author: list[Author] | None = None + category: str | None = Field(default=None) + rights: str | None = Field(default=None) + link: Sequence["Link"] = Field(default_factory=list) + summary: str | None = None + content: Optional["Content"] = None + + # MAY have these fields + contributor: str | None = ( + None # represent contributors to the Publication beside its creators. + ) + published: str | None = ( + None # indicates when the OPDS Catalog Entry was first accessible + ) + + dc_language: str | None = Field(default=None, serialization_alias="dc:language") + dc_publisher: str | None = Field(default=None, serialization_alias="dc:publisher") + + def model_dump(self, **kwargs) -> dict[str, Any]: + data = super().model_dump(**kwargs) + return {"entry": data} + +@dataclass +class PaginationResult: + next_link: Optional[Link] + prev_link: Optional[Link] + current_offset: int + total_count: int \ No newline at end of file diff --git a/backend/src/chitai/services/opds/opds.py b/backend/src/chitai/services/opds/opds.py new file mode 100644 index 0000000..5b1b01b --- /dev/null +++ b/backend/src/chitai/services/opds/opds.py @@ -0,0 +1,319 @@ + +from typing import Any, Callable, Sequence +from urllib.parse import quote_plus, urlencode +from litestar import Request +import xmltodict +from datetime import datetime +from chitai.database import models as m +from .models import ( + Author, + Entry, + Link, + LinkTypes, + ImageLink, + AcquisitionLink, + AcquisitionFeed, + AcquisitionFeedLink, + NavigationFeed, + NavigationFeedLink, + PaginationResult +) + +def get_opensearch_document(base_url: str = "/opds/search?") -> str: + search = { + "OpenSearchDescription": { + "@xmlns": "http://a9.com/-/spec/opensearch/1.1/", + "Url": { + "@type": "application/atom+xml;profile=opds-catalog;kind=acquisition", + "@template": base_url + "searchString={searchTerms}", + }, + } + } + + return xmltodict.unparse(search) + + +def convert_book_to_entry(book: m.Book) -> Entry: + return Entry( + id=str(book.id), + title=book.title, + updated=book.updated_at, + author=[Author(name=author.name) for author in book.authors], + dc_identifier=[f"{id.name}:{id.value}" for id in book.identifiers], + dc_publisher=book.publisher.name if book.publisher is not None else None, + dc_language=book.language, + dc_issued=str(book.published_date), + summary=book.description, + link=[ + ImageLink(href=f"/{book.cover_image}", type="image/webp"), + *[ + AcquisitionLink( + href=f"/opds/download/{book.id}/{file.id}", type=file.content_type + ) + for file in book.files + ], + ], + ) + + +def create_acquisition_feed( + id: str, + title: str, + url: str, + books: Sequence[m.Book], + updated: datetime = datetime.now(), + links: Sequence[Link] = list(), +) -> str: + feed = AcquisitionFeed( + id=id, + title=title, + updated=updated, + link=[ + Link( + rel="self", + href=url, + type="application/atom+xml;profile=opds-catalog;kind=acquisition", + ), + *links, + ], + entry=[convert_book_to_entry(book) for book in books], + ) + + return xmltodict.unparse( + feed.model_dump(by_alias=True, exclude_none=True, exclude_defaults=False), + pretty=True, + ) + + +def create_navigation_feed( + id: str, + title: str, + self_url: str, + entries: list[Entry] = list(), + links: Sequence[Link] = list(), + updated: datetime = datetime.now(), + parent_url: str | None = None, +) -> str: + + self_link = Link(rel="self", href=self_url, type=LinkTypes.NAVIGATION) + parent_link = Link( + rel="up" if parent_url else "start", + href=parent_url if parent_url else self_url, + type=LinkTypes.NAVIGATION, + ) + + feed = NavigationFeed( + id=id, + link=[self_link, parent_link, *links], + title=title, + updated=updated, + entry=entries, + ) + + return xmltodict.unparse( + feed.model_dump(by_alias=True, exclude_none=True, exclude_defaults=False), + pretty=True, + ) + +def create_library_navigation_feed(library: m.Library) -> str: + + entries = [ + Entry( + id=f"/opds/library/{library.id}/all-books", + title='All Books', + link=[ + AcquisitionFeedLink( + rel="subsection", + href=f"/opds/acquisition?libraries={library.id}&paginated=1&pageSize=50&feed_title=AllBooks&feed_id=/opds/library/{library.id}/all-books", + title="All Books", + ) + ] + ), + Entry( + id=f"/opds/library/{library.id}/recently-added", + title="Recently Added", + link=[ + NavigationFeedLink( + rel="http://opds-spec.org/sort/new", + href=f"/opds/acquisition?libraries={library.id}&orderBy=created_at&pageSize=50&feed_title=RecentlyAdded&feed_id=/opds/library/{library.id}/recently-added", + title="Recently Added" + ) + ] + ), + Entry( + id=f"/opds/library/{library.id}/shelves", + title="Bookshelves", + link=[ + NavigationFeedLink( + rel="subsection", + href=f"/opds/library/{library.id}/shelves?paginated=1&pageSize=10", + title="Bookshelves" + ) + ] + ), + Entry( + id=f"/opds/library/{library.id}/tags", + title="Tags", + link=[ + NavigationFeedLink( + rel="subsection", + href=f"/opds/library/{library.id}/tags?paginated=1&pageSize=10", + title="Tags" + ) + ] + ), + Entry( + id=f"/opds/library/{library.id}/authors", + title="Authors", + link=[ + NavigationFeedLink( + rel="subsection", + href=f"/opds/library/{library.id}/authors?paginated=1&pageSize=10", + title="Authors" + ) + ] + ), + Entry( + id=f"/opds/library/{library.id}/publishers", + title="Publishers", + link=[ + NavigationFeedLink( + rel="subsection", + href=f"/opds/library/{library.id}/publishers?paginated=1&pageSize=10", + title="Publishers" + ) + ] + ), + + ] + + feed = create_navigation_feed( + id=f'/library/{library.id}', + title=library.name, + self_url=f'/opds/library/{library.id}', + links=[ + + ], + entries=entries + ) + + return feed + +def create_collection_navigation_feed( + library: m.Library, + collection_type: str, + items: Sequence[m.BookList | m.Tag | m.Author | m.Publisher | m.BookSeries], + links: list[Link] = list(), + # Title is usually derived from the model's name or title + get_title: Callable[[Any], str] = lambda x: getattr(x, 'title', getattr(x, 'name', str(x))) +) -> str: + + entries = [ + Entry( + id=f"/opds/library/{library.id}/{collection_type}/{item.id}", + title=get_title(item), + link=[ + AcquisitionFeedLink( + href=f"/opds/acquisition?{collection_type}={item.id}&pageSize=50&paginated=1&feed_title={quote_plus(get_title(item))}&feed_id=/opds/library/{library.id}/{collection_type}/{item.id}&search=True", + title=get_title(item), + ) + ] + ) for item in items + ] + + return create_navigation_feed( + id=f"/opds/library/{library.id}/{collection_type}", + title=collection_type.title(), + self_url=f'/opds/library/{library.id}/{collection_type}', + entries=entries, + links=links + ) + +def create_next_paginated_link( + request: Request, + total: int, + current_count: int, + offset: int, + feed_title: str + ) -> Link | None: + if total <= current_count + offset: + return None + + params = dict(request.query_params) + params['currentPage'] = params.get('currentPage', 1) + 1 + + next_url = f"{request.url.path}?{urlencode(list(params.items()), doseq=True)}" + + return Link( + rel="next", + href=next_url, + title=feed_title, + type=LinkTypes.NAVIGATION + ) + +def create_search_link( + request: Request, + exclude_params: set[str] | None = None +) -> Link: + """Create search link with current filters applied""" + if exclude_params is None: + exclude_params = {'currentPage', 'feed_title', 'feed_id', 'search', 'paginated'} + + params = { + k: v for k, v in request.query_params.items() + if k not in exclude_params + } + + return Link( + rel="search", + href=f"/opds/opensearch?{urlencode(list(params.items()), doseq=True)}", + type=LinkTypes.OPEN_SEARCH, + title="Search books", + ) + + + +def create_pagination_links( + request: Request, + total: int, + limit: int, + offset: int, + feed_title: str = "", + link_type: str = LinkTypes.ACQUISITION, +) -> PaginationResult: + """Create next/prev pagination links using limit/offset""" + + next_link = None + prev_link = None + + # Create next link if there are more items + if offset + limit < total: + params = dict(request.query_params) + # Calculate next page number + current_page = (offset // limit) + 1 + params['currentPage'] = current_page + 1 + + next_url = f"{request.url.path}?{urlencode(params, doseq=True)}" + next_link = Link( + rel="next", + href=next_url, + title=f"{feed_title} - Next", + type=link_type + ) + + # Create previous link if not on first page + if offset > 0: + params = dict(request.query_params) + # Calculate previous page number + current_page = (offset // limit) + 1 + params['currentPage'] = max(1, current_page - 1) + + prev_url = f"{request.url.path}?{urlencode(params, doseq=True)}" + prev_link = Link( + rel="previous", + href=prev_url, + title=f"{feed_title} - Previous", + type=link_type + ) + + return PaginationResult(next_link, prev_link, offset, total) diff --git a/backend/src/chitai/services/publisher.py b/backend/src/chitai/services/publisher.py new file mode 100644 index 0000000..2c876f1 --- /dev/null +++ b/backend/src/chitai/services/publisher.py @@ -0,0 +1,19 @@ +# src/chitai/services/publisher.py + +# Third-party libraries +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository + +# Local Imports +from chitai.database.models import Publisher + + +class PublisherService(SQLAlchemyAsyncRepositoryService[Publisher]): + """Publisher service for managing publisher operations.""" + + class Repo(SQLAlchemyAsyncRepository[Publisher]): + """Publisher repository.""" + + model_type = Publisher + + repository_type = Repo diff --git a/backend/src/chitai/services/tag.py b/backend/src/chitai/services/tag.py new file mode 100644 index 0000000..0bd481f --- /dev/null +++ b/backend/src/chitai/services/tag.py @@ -0,0 +1,19 @@ +# src/chitai/services/tag.py + +# Third-party libraries +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository + +# Local Imports +from chitai.database.models import Tag + + +class TagService(SQLAlchemyAsyncRepositoryService[Tag]): + """Tag service for managing tag operations.""" + + class Repo(SQLAlchemyAsyncRepository[Tag]): + """Tag repository.""" + + model_type = Tag + + repository_type = Repo diff --git a/backend/src/chitai/services/user.py b/backend/src/chitai/services/user.py new file mode 100644 index 0000000..f465cbc --- /dev/null +++ b/backend/src/chitai/services/user.py @@ -0,0 +1,76 @@ +# src/chitai/services/user.py + +# Standard library +import logging + +# Third-party library +from advanced_alchemy.service import SQLAlchemyAsyncRepositoryService +from advanced_alchemy.repository import SQLAlchemyAsyncRepository +from litestar.exceptions import PermissionDeniedException +from litestar.security.jwt import Token + +# Local imports +from chitai.database.models.user import User + +logger = logging.getLogger(__name__) + + +class UserService(SQLAlchemyAsyncRepositoryService[User]): + """User service for managing user operations.""" + + class Repo(SQLAlchemyAsyncRepository[User]): + model_type = User + + repository_type = Repo + + async def authenticate(self, email: str, password: str) -> User: + """ + Authenticate a user by email and password. + + Verifies that the user exists and the provided password matches their argon2 hash. + + Args: + email: The user's email address. + password: The plain text password to verify. + + Returns: + The authenticated User entity. + + Raises: + PermissionDeniedException: If the user does not exist or password is invalid. + Uses generic message to prevent user enumeration. + """ + + user = await self.get_one_or_none(email=email) + + if not user or not user.password.verify(password): + logger.warning(f"Login failed for: {email}") + raise PermissionDeniedException("User not found or password invalid.") + + return user + + async def get_user_by_token(self, token: Token) -> User: + """ + Retrieve a user by their authentication token. + + Assumes the token has already been validated and decoded by the OAuth2 middleware. + This function only fetches the corresponding user from the database using the + email from the token's 'sub' claim. + + Args: + token: The decoded authentication token (pre-validated by OAuth2 middleware) + containing the user's email in the 'sub' claim. + + Returns: + The User entity associated with the token. + + Raises: + PermissionDeniedException: If no user exists for the email in the token, + or if the user account is inactive. + """ + user = await self.get_one_or_none(email=token.sub) + + if not user: + raise PermissionDeniedException("Invalid token.") + + return user diff --git a/backend/src/chitai/services/utils.py b/backend/src/chitai/services/utils.py new file mode 100644 index 0000000..d7486ec --- /dev/null +++ b/backend/src/chitai/services/utils.py @@ -0,0 +1,358 @@ +# src/chitai/services/utils.py + +# Standard library +from pathlib import Path +import shutil +from typing import BinaryIO + +# Third-party libraries +import PIL +import PIL.Image +import aiofiles +import aiofiles.os as aios +from litestar.datastructures import UploadFile + +################################## +# Filesystem related utilities # +################################## + + +class DirectoryDoesNotExist(Exception): + """Raised when an operation requires a directory that does not exist.""" + + ... + + +async def directory_exists(dir_path: Path | str): + """ + Check if a directory exists. + + Args: + dir_path: The directory path to check. + + Returns: + True if the directory exists, False otherwise. + """ + + return await aios.path.exists(dir_path) + + +async def create_directory(dir_path: Path | str) -> None: + """ + Create a directory if it doesn't already exist. + + Prints a message indicating whether the directory was created or already existed. + + Args: + dir_path: The directory path to create. + """ + + await aios.makedirs(dir_path, exist_ok=True) + +async def move_file(src_path: Path, dest_path: Path, create_dirs=True) -> None: + """ + Move a file from source to destination asynchronously. + + Args: + source_path: Path to the source file + destination_path: Path to the destination file + """ + + # Create destination directory if needed + if create_dirs: + dest_dir = dest_path.parent + if dest_dir: # Only create if there's a directory path + await aios.makedirs(dest_dir, exist_ok=True) + + await aios.rename(src_path, dest_path) + +async def move_dir_contents(source_dir: Path | str, target_dir: Path | str) -> None: + """ + Move all contents from source directory to target directory. + + Creates the target directory if it doesn't exist. Raises an error if the + source directory does not exist or is not a directory. + + Args: + source_dir: The directory to move contents from. + target_dir: The directory to move contents to. + + Raises: + FileNotFoundError: If source_dir does not exist. + NotADirectoryError: If source_dir is not a directory. + """ + + source_dir = Path(source_dir) + target_dir = Path(target_dir) + + if not source_dir.exists(): + raise FileNotFoundError(f"The directory {source_dir} does not exist") + if not source_dir.is_dir(): + raise NotADirectoryError(f"The path {source_dir} is not a directory") + + if not target_dir.exists(): + target_dir.mkdir(parents=True, exist_ok=True) + + for item in source_dir.iterdir(): + shutil.move(item, target_dir / item.name) + + +# TODO: Refactor delete_directory to use async I/O for better performance in async contexts. +def delete_directory(directory_path: Path | str): + """ + Recursively delete a directory and all its contents. + + TODO: Consider changing the implementation to async + + Args: + directory_path: The directory to delete. + """ + + shutil.rmtree(directory_path) + + +def cleanup_empty_parent_directories(path: Path, root_path: Path) -> None: + """ + Remove empty directories from path up to (but not including) root_path. + + Walks up the directory tree from the given path, deleting each empty directory + until reaching the root_path or a non-empty directory. + + Args: + path: The starting directory path. + root_path: The root directory to stop at (not included in deletion). + """ + + # Ensure that the path is a subpath of the root + if not path.is_relative_to(root_path): + raise ValueError("Path must be a subdirectory of root path.") + + while path != root_path: + if path.exists() and is_empty(path): + delete_directory(path) + path = path.parent + + +def is_empty(directory: Path | str): + """ + Check if a directory is empty. + + Args: + directory: The directory path to check. + + Returns: + True if the directory is empty, False otherwise. + + Raises: + ValueError: If the path does not exist or is not a directory. + """ + + path = Path(directory) + + if not path.exists() or not path.is_dir(): + raise ValueError(f"{directory} is not a valid directory") + + return not any(path.iterdir()) + + +async def delete_file(filepath: Path | str): + """ + Idempotently delete a file. + + Args: + filepath: The file path to delete. + """ + try: + await aios.remove(filepath) + except FileNotFoundError: + pass + + +async def create_temp_file(data: BinaryIO | bytes): + """ + Create a temporary file with the given data. + + Args: + data: Binary data or file-like object to write to the temporary file. + + Returns: + Path to the created temporary file. + """ + + async with aiofiles.tempfile.NamedTemporaryFile( + "wb+", delete_on_close=False, delete=False + ) as file: + if isinstance(data, bytes): + await file.write(data) + else: + # Handle file-like objects + data.seek(0) + file_data = data.read() + await file.write(file_data) + file_path = str(file.name) + return Path(file_path) + + +async def save_file(data: BinaryIO | bytes, filepath: Path) -> None: + """ + Save binary data to a file. + + Handles both raw bytes and file-like objects. If data is a file-like object, + it will be read and the file pointer will be reset to the beginning. + + Args: + data: Binary data or file-like object to save. + filepath: The file path where data will be saved. + """ + + async with aiofiles.open(filepath, "wb+") as f: + if not isinstance(data, bytes): + await data.seek(0) + data = await data.read() + + await f.write(data) + await data.seek(0) + + +async def save_image( + img: PIL.Image.Image, filepath: Path, image_type: str = "WEBP" +) -> None: + """ + Save a PIL Image to a file. + + Args: + img: The PIL Image object to save. + filepath: The file path where the image will be saved. + image_type: The image format to save in (default: "WEBP"). + """ + + img.save(filepath, image_type) + + +################################## +# Path and filename operations # +################################## + + +def get_file_extension(file: Path | str | UploadFile) -> str | None: + """ + Extract the file extension from a file path. + + Returns the extension in lowercase without the leading dot. + + Args: + file_path: The file path as a string, Path object, or UploadFile object. + + Returns: + The file extension in lowercase (e.g., "pdf", "txt"), or None if the path is empty. + """ + + if isinstance(file, str): + return Path(file).suffix.lower()[1:] + + elif isinstance(file, Path): + return file.suffix.lower()[1:] + + elif isinstance(file, UploadFile): + return Path(file.filename).suffix.lower()[1:] + + raise ValueError("file object type is not supported") + + +def get_filename(file: Path | str, ext: bool = True) -> str: + """ + Extract the filename from a file path. + + Args: + file_path: The file path as a string or Path object. + ext: If True (default), returns the full filename with extension. + If False, returns just the stem (filename without extension). + + Returns: + The filename, or None if the path is empty. + """ + + if isinstance(file, UploadFile): + filename = Path(file.filename) + elif isinstance(file, str): + filename = Path(Path(file).name) + elif isinstance(file, Path): + filename = Path(file.name) + else: + raise ValueError("file object type is not supported") + + if ext: + return str(filename) + + return filename.stem + + +############################### +# ISBN Validation utilities # +############################### + + +def is_valid_isbn(isbn: str) -> bool: + """ + Validate an ISBN-10 or ISBN-13 number. + + Automatically detects the ISBN format based on length and validates accordingly. + + Args: + isbn: The ISBN string to validate. + + Returns: + True if the ISBN is valid, False otherwise. + """ + + try: + if len(isbn) == 10: + return is_valid_isbn10(isbn) + elif len(isbn) == 13: + return is_valid_isbn13(isbn) + else: + return False + except: + return False + + +def is_valid_isbn10(isbn: str) -> bool: + """ + Validate an ISBN-10 number using its check digit. + + ISBN-10 uses a weighted sum where each digit is multiplied by its position + (10 down to 1) and the result modulo 11 determines the check digit. + + Args: + isbn: The 10-character ISBN string to validate. + + Returns: + True if the ISBN-10 is valid, False otherwise. + """ + sum = 0 + for i in range(9): + sum += int(isbn[i]) * (10 - i) + + check_digit = 11 - (sum % 11) + return str(check_digit) == isbn[-1] or (check_digit == 10 and isbn[-1] in "Xx") + + +def is_valid_isbn13(isbn: str) -> bool: + """ + Validate an ISBN-13 number using its check digit. + + ISBN-13 uses a weighted sum where digits alternate between multipliers of 1 and 3, + and the result modulo 10 determines the check digit. + + Args: + isbn: The 13-character ISBN string to validate. + + Returns: + True if the ISBN-13 is valid, False otherwise. + """ + sum = 0 + for i in range(12): + sum += int(isbn[i]) * (1 if i % 2 == 0 else 3) + + check_digit = 10 - (sum % 10) + return str(check_digit % 10) == isbn[-1] diff --git a/backend/tests/__init__.py b/backend/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/tests/conftest.py b/backend/tests/conftest.py new file mode 100644 index 0000000..94f1637 --- /dev/null +++ b/backend/tests/conftest.py @@ -0,0 +1,257 @@ +from pathlib import Path +from uuid import uuid4 +import pytest + +from advanced_alchemy.base import UUIDAuditBase +from litestar.testing import AsyncTestClient +from sqlalchemy import text +from sqlalchemy.ext.asyncio import ( + AsyncSession, + AsyncEngine, + async_sessionmaker, + create_async_engine, +) +from sqlalchemy.engine import URL +from sqlalchemy.pool import NullPool + +from chitai.database import models as m +from chitai.config import settings + +from collections.abc import AsyncGenerator + +from litestar import Litestar + +from pytest_databases.docker.postgres import PostgresService +from sqlalchemy.orm import selectinload + +pytest_plugins = [ + "tests.data_fixtures", + "pytest_databases.docker", + "pytest_databases.docker.postgres", +] + +# Set the environment to use the testing database +# os.environ.update( +# { +# "POSTGRES_DB": "chitai_testing" +# } +# ) + + +@pytest.fixture(autouse=True) +def _patch_settings(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(settings, "book_cover_path", f"{tmp_path}/covers") + + +@pytest.fixture(name="engine") +async def fx_engine( + postgres_service: PostgresService, +) -> AsyncGenerator[AsyncEngine, None]: + """PostgreSQL instance for testing""" + engine = create_async_engine( + URL( + drivername="postgresql+asyncpg", + username=postgres_service.user, + password=postgres_service.password, + host=postgres_service.host, + port=postgres_service.port, + database=postgres_service.database, + query={}, # type:ignore[arg-type] + ), + echo=False, + poolclass=NullPool, + ) + + # Add pg_trgm extension + async with engine.begin() as conn: + await conn.execute(text("CREATE EXTENSION IF NOT EXISTS pg_trgm")) + + # Create all tables + metadata = UUIDAuditBase.registry.metadata + async with engine.begin() as conn: + await conn.run_sync(metadata.create_all) + + yield engine + + # Clean up + async with engine.begin() as conn: + await conn.run_sync(metadata.drop_all) + await engine.dispose() + + +@pytest.fixture(name="sessionmaker") +def fx_sessionmaker(engine: AsyncEngine) -> async_sessionmaker[AsyncSession]: + """Create sessionmaker factory.""" + return async_sessionmaker(bind=engine, expire_on_commit=False) + + +@pytest.fixture +async def session( + sessionmaker: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[AsyncSession, None]: + """Create database session for tests.""" + async with sessionmaker() as session: + yield session + await session.rollback() + await session.close() + + +@pytest.fixture +async def app() -> Litestar: + """Create Litestar app for testing.""" + + from chitai.app import create_app + + return create_app() + + +@pytest.fixture +async def client(app: Litestar) -> AsyncGenerator[AsyncTestClient, None]: + """Create test client.""" + async with AsyncTestClient(app=app) as client: + yield client + + +@pytest.fixture +async def authenticated_client( + client: AsyncTestClient, test_user: m.User +) -> AsyncTestClient: + """Create authenticated test client.""" + + # login and set auth headers + login_response = await client.post( + "access/login", data={"email": test_user.email, "password": "password123"} + ) + + assert login_response.status_code == 201 + + result = login_response.json() + token = result["access_token"] + client.headers.update({"Authorization": f"Bearer {token}"}) + + return client + + +@pytest.fixture +async def other_authenticated_client( + app: Litestar, test_user2: m.User +) -> AsyncGenerator[AsyncTestClient, None]: + """Create second authenticated test client as different user.""" + async with AsyncTestClient(app=app) as other_client: + login_response = await other_client.post( + "access/login", data={"email": test_user2.email, "password": "password234"} + ) + assert login_response.status_code == 201 + result = login_response.json() + token = result["access_token"] + other_client.headers.update({"Authorization": f"Bearer {token}"}) + yield other_client + + +# Service fixtures +from chitai import services + + +@pytest.fixture +async def user_service( + sessionmaker: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[services.UserService, None]: + """Create UserService instance.""" + async with sessionmaker() as session: + async with services.UserService.new(session) as service: + yield service + + +@pytest.fixture +async def library_service( + sessionmaker: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[services.LibraryService, None]: + """Create LibraryService instance.""" + async with sessionmaker() as session: + async with services.LibraryService.new(session) as service: + yield service + + +@pytest.fixture +async def books_service( + sessionmaker: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[services.BookService, None]: + """Create BookService instance.""" + async with sessionmaker() as session: + async with services.BookService.new( + session, + load=[ + selectinload(m.Book.author_links).selectinload(m.BookAuthorLink.author), + selectinload(m.Book.tag_links).selectinload(m.BookTagLink.tag), + m.Book.publisher, + m.Book.files, + m.Book.identifiers, + m.Book.series, + ], + ) as service: + yield service + + +@pytest.fixture +async def bookshelf_service( + sessionmaker: async_sessionmaker[AsyncSession], +) -> AsyncGenerator[services.ShelfService]: + """Create ShelfService instance.""" + async with sessionmaker() as session: + async with services.ShelfService.new(session) as service: + yield service + + +# Data fixtures + + +@pytest.fixture +async def test_user(session: AsyncSession) -> AsyncGenerator[m.User, None]: + """Create a test user.""" + + unique_id = str(uuid4())[:8] + user = m.User( + email=f"user{unique_id}@example.com", + password="password123", + ) + + session.add(user) + await session.commit() + await session.refresh(user) + yield user + + +@pytest.fixture +async def test_user2(session: AsyncSession) -> AsyncGenerator[m.User, None]: + """Create another test user.""" + + unique_id = str(uuid4())[:8] + user = m.User( + email=f"user{unique_id}@example.com", + password="password234", + ) + + session.add(user) + await session.commit() + await session.refresh(user) + yield user + + +@pytest.fixture +async def test_library( + session: AsyncSession, tmp_path: Path +) -> AsyncGenerator[m.Library, None]: + """Create a test library.""" + + library = m.Library( + name="Testing Library", + slug="testing-library", + root_path=str(tmp_path), + path_template="{author_name}/{title}.{ext}", + read_only=False, + ) + + session.add(library) + await session.commit() + await session.refresh(library) + yield library diff --git a/backend/tests/data_files/A Tale of Two Cities - Charles Dickens.epub b/backend/tests/data_files/A Tale of Two Cities - Charles Dickens.epub new file mode 100644 index 0000000..9623365 Binary files /dev/null and b/backend/tests/data_files/A Tale of Two Cities - Charles Dickens.epub differ diff --git a/backend/tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf b/backend/tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf new file mode 100644 index 0000000..ebef8fc Binary files /dev/null and b/backend/tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf differ diff --git a/backend/tests/data_files/Frankenstein - Mary Shelley.epub b/backend/tests/data_files/Frankenstein - Mary Shelley.epub new file mode 100644 index 0000000..59d99ed Binary files /dev/null and b/backend/tests/data_files/Frankenstein - Mary Shelley.epub differ diff --git a/backend/tests/data_files/Metamorphosis - Franz Kafka.epub b/backend/tests/data_files/Metamorphosis - Franz Kafka.epub new file mode 100644 index 0000000..a04cf27 Binary files /dev/null and b/backend/tests/data_files/Metamorphosis - Franz Kafka.epub differ diff --git a/backend/tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub b/backend/tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub new file mode 100644 index 0000000..3d15457 Binary files /dev/null and b/backend/tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub differ diff --git a/backend/tests/data_files/On The Origin of Species By Means of Natural Selection - Charles Darwin.epub b/backend/tests/data_files/On The Origin of Species By Means of Natural Selection - Charles Darwin.epub new file mode 100644 index 0000000..3c5fbaa Binary files /dev/null and b/backend/tests/data_files/On The Origin of Species By Means of Natural Selection - Charles Darwin.epub differ diff --git a/backend/tests/data_files/Relativity: The Special and General Theory - Albert Einstein.epub b/backend/tests/data_files/Relativity: The Special and General Theory - Albert Einstein.epub new file mode 100644 index 0000000..7af2479 Binary files /dev/null and b/backend/tests/data_files/Relativity: The Special and General Theory - Albert Einstein.epub differ diff --git a/backend/tests/data_files/The Adventures of Sherlock Holmes - Arthur Conan Doyle.epub b/backend/tests/data_files/The Adventures of Sherlock Holmes - Arthur Conan Doyle.epub new file mode 100644 index 0000000..25a4ec2 Binary files /dev/null and b/backend/tests/data_files/The Adventures of Sherlock Holmes - Arthur Conan Doyle.epub differ diff --git a/backend/tests/data_files/The Art of War - Sun Tzu.epub b/backend/tests/data_files/The Art of War - Sun Tzu.epub new file mode 100644 index 0000000..cd6a107 Binary files /dev/null and b/backend/tests/data_files/The Art of War - Sun Tzu.epub differ diff --git a/backend/tests/data_files/cover.jpg b/backend/tests/data_files/cover.jpg new file mode 100644 index 0000000..2cf4ed9 Binary files /dev/null and b/backend/tests/data_files/cover.jpg differ diff --git a/backend/tests/data_fixtures.py b/backend/tests/data_fixtures.py new file mode 100644 index 0000000..b204fff --- /dev/null +++ b/backend/tests/data_fixtures.py @@ -0,0 +1,57 @@ +from pathlib import Path +import pytest + +from typing import Any + +from chitai.database import models as m + + +@pytest.fixture(name="raw_users") +def fx_raw_users() -> list[m.User | dict[str, Any]]: + """Unstructured user representations.""" + + return [ + {"email": "user1@example.com", "password": "password123"}, + {"email": "user2@example.com", "password": "password234"}, + ] + + +@pytest.fixture(name="raw_libraries") +def fx_raw_libraries(tmp_path: Path) -> list[m.Library | dict[str, Any]]: + """Unstructured library representations.""" + + return [ + { + "name": "Default Test Library", + "slug": "default-test-library", + "root_path": f"{tmp_path}/default_library", + "path_template": "{author}/{title}", + "read_only": False, + }, + { + "name": "Test Textbook Library", + "slug": "test-textbook-library", + "root_path": f"{tmp_path}/textbooks", + "path_template": "{author}/{title}", + "read_only": False, + }, + ] + + +@pytest.fixture(name="raw_books") +def fx_raw_books() -> list[m.Book | dict[str, Any]]: + """Unstructured book representations.""" + + return [ + { + "library_id": 1, + "title": "The Fellowship of the Ring", + "path": "books/J.R.R Tolkien/Lord of the Rings/01 - The Fellowship of The Ring", + "pages": 427, + "authors": [{"name": "J.R.R Tolkien"}], + "tags": [{"name": "Fantasy"}, {"name": "Adventure"}], + "identifiers": {"isbn-13": "9780261102354"}, + "series": {"name": "The Lord of the Rings"}, + "series_position": "1", + } + ] diff --git a/backend/tests/integration/conftest.py b/backend/tests/integration/conftest.py new file mode 100644 index 0000000..0ba3eac --- /dev/null +++ b/backend/tests/integration/conftest.py @@ -0,0 +1,157 @@ +import json +from pathlib import Path +from httpx import AsyncClient +import pytest + +from collections.abc import AsyncGenerator +from typing import Any + +from sqlalchemy.ext.asyncio import ( + AsyncSession, + AsyncEngine, + async_sessionmaker, +) +from advanced_alchemy.base import UUIDAuditBase +from chitai.database import models as m +from chitai import services +from chitai.database.config import config + + +@pytest.fixture(autouse=True) +def _patch_db( + engine: AsyncEngine, + sessionmaker: async_sessionmaker[AsyncSession], + monkeypatch: pytest.MonkeyPatch, +) -> None: + monkeypatch.setattr(config, "session_maker", sessionmaker) + monkeypatch.setattr(config, "engine_instance", engine) + + +@pytest.fixture(autouse=True) +async def _seed_db( + engine: AsyncEngine, + sessionmaker: async_sessionmaker[AsyncSession], + raw_users: list[m.User | dict[str, Any]], + raw_libraries: list[m.Library | dict[str, Any]], +) -> AsyncGenerator[None, None]: + """Populate test database with. + + Args: + engine: The SQLAlchemy engine instance. + sessionmaker: The SQLAlchemy sessionmaker factory. + raw_users: Test users to add to the database + raw_teams: Test teams to add to the database + + """ + + metadata = UUIDAuditBase.registry.metadata + async with engine.begin() as conn: + await conn.run_sync(metadata.drop_all) + await conn.run_sync(metadata.create_all) + + async with services.UserService.new(sessionmaker()) as users_service: + await users_service.create_many(raw_users, auto_commit=True) + + async with services.LibraryService.new(sessionmaker()) as library_service: + await library_service.create_many(raw_libraries, auto_commit=True) + + yield + + +@pytest.fixture +async def populated_authenticated_client( + authenticated_client: AsyncClient, books_to_upload: list[tuple[Path, dict]] +) -> AsyncClient: + # Upload books + for path, data in books_to_upload: + await upload_book_via_api(authenticated_client, data, path) + + await create_bookshelf( + authenticated_client, {"title": "Favourites", "library_id": 1} + ) + + await add_books_to_bookshelf(authenticated_client, 1, [1, 2]) + + return authenticated_client + + +@pytest.fixture +def books_to_upload() -> list[tuple[Path, dict]]: + return [ + ( + Path( + "tests/data_files/The Adventures of Sherlock Holmes - Arthur Conan Doyle.epub" + ), + { + "library_id": "1", + "title": "The Adventures of Sherlock Holmes", + "description": "Some description...", + "authors": "Arthur Conan Doyle", + "publisher": "Some Publisher", + "tags": "Mystery", + "edition": "2", + "language": "en", + "pages": "300", + "series": "Sherlock Holmes", + "series_position": "1", + "identifiers": json.dumps({"isbn-10": "1234567890"}), + }, + ), + ( + Path("tests/data_files/Frankenstein - Mary Shelley.epub"), + { + "library_id": "1", + "title": "Frankenstein", + "description": "Some description...", + "authors": "Mary Shelley", + "tags": "Mystery", + "edition": "1", + "language": "en", + "pages": "250", + }, + ), + ( + Path("tests/data_files/A Tale of Two Cities - Charles Dickens.epub"), + { + "library_id": "1", + "title": "A Tale of Two Cities", + "description": "Some description...", + "authors": "Charles Dickens", + "tags": "Classic", + "edition": "1", + "language": "en", + "pages": "500", + }, + ), + ] + + +async def upload_book_via_api( + client: AsyncClient, book_data: dict, book_file_path: Path +) -> None: + with book_file_path.open("rb") as file: + files = {"files": file} + + response = await client.post("/books?library_id=1", data=book_data, files=files) + + assert response.status_code == 201 + + +async def create_bookshelf(client: AsyncClient, shelf_data: dict) -> None: + response = await client.post("/shelves", json=shelf_data) + + assert response.status_code == 201 + + +async def add_books_to_bookshelf( + client: AsyncClient, shelf_id: int, book_ids: list[int] +) -> None: + query_params = "" + for id in book_ids: + query_params += f"book_ids={id}&" + + response = await client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": book_ids} + ) + + assert response.status_code == 201 diff --git a/backend/tests/integration/test_access.py b/backend/tests/integration/test_access.py new file mode 100644 index 0000000..bdaa216 --- /dev/null +++ b/backend/tests/integration/test_access.py @@ -0,0 +1,91 @@ +import pytest +from httpx import AsyncClient + +from chitai.database import models as m + + +@pytest.mark.parametrize( + ("email", "password", "expected_status_code"), + [ + ("user1@example.com", "password123", 201), # Valid credentials + ("user1@example.com", "password234", 401), # Invalid password + ("user2@example.com", "password234", 201), # Valid credentials + ("user2@example.com", "password123", 401), # Invalid password + ("nonexistentUser@example.com", "password123", 401), # Invalid email + ], +) +async def test_user_login( + client: AsyncClient, email: str, password: str, expected_status_code: int +) -> None: + """Test login functionality with valid and invalid credentials.""" + + response = await client.post( + "/access/login", data={"email": email, "password": password} + ) + + assert response.status_code == expected_status_code + + if response.status_code == 201: + result = response.json() + assert result["access_token"] is not None + + +async def test_get_user_by_access_token( + authenticated_client: AsyncClient, test_user: m.User +) -> None: + """Test getting user info via their access token.""" + + response = await authenticated_client.get("/access/me") + assert response.status_code == 200 + + result = response.json() + assert result["email"] == test_user.email + + +async def test_get_user_without_access_token(client: AsyncClient) -> None: + response = await client.get("/access/me") + + assert response.status_code == 401 + + +async def test_user_registration_weak_password(client: AsyncClient) -> None: + """Test user registration with a weak password.""" + + response = await client.post( + "/access/signup", json={"email": "weak@example.com", "password": "weak"} + ) + + assert response.status_code == 400 + + msg = response.json()["extra"][0]["message"] + assert "Password must be at least 8 characters long" in msg + + +async def test_user_registration(client: AsyncClient) -> None: + """Test registering a new user and successfully loggin in.""" + + user_data = {"email": "newuser@example.com", "password": "password123"} + + signup_response = await client.post("/access/signup", json=user_data) + + assert signup_response.status_code == 201 + + # Login using the same credentials + + login_response = await client.post("/access/login", data=user_data) + + assert login_response.status_code == 201 + + +async def test_user_registration_with_duplicate_email(client: AsyncClient) -> None: + """Test registerig a new user using a duplicate email.""" + + user_data = {"email": "user1@example.com", "password": "password12345"} + + response = await client.post("/access/signup", json=user_data) + + assert response.status_code == 409 + + result = response.json() + + assert "A user with this email already exists" in result["detail"] diff --git a/backend/tests/integration/test_book.py b/backend/tests/integration/test_book.py new file mode 100644 index 0000000..752d337 --- /dev/null +++ b/backend/tests/integration/test_book.py @@ -0,0 +1,870 @@ +import pytest +from httpx import AsyncClient +from pathlib import Path + + +@pytest.mark.parametrize( + ("path_to_book", "library_id", "title", "authors"), + [ + ( + Path("tests/data_files/Metamorphosis - Franz Kafka.epub"), + 1, + "Metamorphosis", + ["Franz Kafka"], + ), + ( + Path("tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub"), + 1, + "Moby Dick; Or, The Whale", + ["Herman Melville"], + ), + ( + Path( + "tests/data_files/Relativity: The Special and General Theory - Albert Einstein.epub" + ), + 2, + "Relativity : the Special and General Theory", + ["Albert Einstein"], + ), + ( + Path( + "/home/patrick/projects/chitai-api/tests/data_files/On The Origin of Species By Means of Natural Selection - Charles Darwin.epub" + ), + 2, + "On the Origin of Species By Means of Natural Selection / Or, the Preservation of Favoured Races in the Struggle for Life", + ["Charles Darwin"], + ), + ( + Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf"), + 2, + "The Project Gutenberg eBook #33283: Calculus Made Easy, 2nd Edition", + ["Silvanus Phillips Thompson"], + ), + ], +) +async def test_upload_book_without_data( + authenticated_client: AsyncClient, + path_to_book: Path, + library_id: int, + title: str, + authors: list[str], +) -> None: + """Test uploading a book file. Book information should be extracted from file.""" + # Read file contents + file_content = path_to_book.read_bytes() + + # Prepare multipart form data + files = [("files", (path_to_book.name, file_content, "application/epub+zip"))] + + # The rest of the book data will be parsed from file + data = { + "library_id": library_id, + } + + response = await authenticated_client.post( + f"/books?library_id={library_id}", + files=files, + data=data, + ) + + assert response.status_code == 201 + book_data = response.json() + + assert book_data["id"] is not None + assert book_data["title"] == title + assert book_data["library_id"] == library_id + + # Check if authors were properly parsed + book_authors = [author["name"] for author in book_data["authors"]] + assert book_authors == authors + + +@pytest.mark.parametrize( + ("path_to_book", "library_id", "title", "authors", "tags"), + [ + ( + Path("tests/data_files/Metamorphosis - Franz Kafka.epub"), + 1, + "The Metamorphosis", + ["Franz Kafka"], + ["Psychological fiction"], + ), + ( + Path("tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub"), + 1, + "Moby Dick", + ["Herman Melville"], + ["Classic Literature", "Whaling"], + ), + ( + Path( + "tests/data_files/Relativity: The Special and General Theory - Albert Einstein.epub" + ), + 2, + "Relativity: the Special and General Theory", + ["Albert Einstein"], + ["Physics", "Mathematics"], + ), + ( + Path( + "/home/patrick/projects/chitai-api/tests/data_files/On The Origin of Species By Means of Natural Selection - Charles Darwin.epub" + ), + 2, + "On the Origin of Species By Means of Natural Selection", + ["Charles Darwin"], + ["Biology"], + ), + ( + Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf"), + 2, + "Calculus Made Easy", + ["Silvanus Thompson"], + ["Mathematics"], + ), + ], +) +async def test_upload_book_with_data( + authenticated_client: AsyncClient, + path_to_book: Path, + library_id: int, + title: str, + authors: list[str], + tags: list[str], +) -> None: + """Test uploading a book file with some book information provided.""" + # Read file contents + file_content = path_to_book.read_bytes() + + # Prepare multipart form data + files = [("files", (path_to_book.name, file_content, "application/epub+zip"))] + + # The rest of the book data will be parsed from file + data = {"library_id": library_id, "title": title, "authors": authors, "tags": tags} + + response = await authenticated_client.post( + f"/books?library_id={library_id}", + files=files, + data=data, + ) + + assert response.status_code == 201 + book_data = response.json() + + assert book_data["id"] is not None + assert book_data["title"] == title + assert book_data["library_id"] == library_id + + book_authors = [author["name"] for author in book_data["authors"]] + assert book_authors == authors + + book_tags = [tag["name"] for tag in book_data["tags"]] + assert book_tags == tags + + +@pytest.mark.parametrize( + ("path_to_book", "library_id"), + [ + (Path("tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub"), 1), + (Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf"), 2), + ], +) +async def test_get_book_file( + authenticated_client: AsyncClient, path_to_book: Path, library_id: int +) -> None: + """Test uploading a book then downloading the book file.""" + + # Read file contents + file_content = path_to_book.read_bytes() + + # Prepare multipart form data + files = [("files", (path_to_book.name, file_content, "application/epub+zip"))] + + # The rest of the book data will be parsed from file + data = { + "library_id": library_id, + } + + create_response = await authenticated_client.post( + f"/books?library_id={library_id}", + files=files, + data=data, + ) + + assert create_response.status_code == 201 + book_data = create_response.json() + + # Retrieve the book file + book_id = book_data["id"] + file_id = book_data["files"][0]["id"] + file_response = await authenticated_client.get( + f"/books/download/{book_id}/{file_id}" + ) + + assert file_response.status_code == 200 + + downloaded_content = file_response.content + + assert len(downloaded_content) == len(file_content) + assert downloaded_content == file_content + + +async def test_get_book_by_id(populated_authenticated_client: AsyncClient) -> None: + """Test retrieving a specific book by ID.""" + + # Retrieve the book + response = await populated_authenticated_client.get(f"/books/1") + + assert response.status_code == 200 + book_data = response.json() + assert book_data["id"] == 1 + assert book_data["title"] == "The Adventures of Sherlock Holmes" + assert len(book_data["authors"]) == 1 + assert book_data["authors"][0]["name"] == "Arthur Conan Doyle" + assert len(book_data["tags"]) == 1 + assert book_data["tags"][0]["name"] == "Mystery" + + +async def test_list_books(populated_authenticated_client: AsyncClient) -> None: + """Test listing books with pagination and filters.""" + response = await populated_authenticated_client.get( + "/books?library_id=1&pageSize=10&page=1" + ) + + assert response.status_code == 200 + data = response.json() + + assert "items" in data # Pagination structure + assert isinstance(data.get("items"), list) + assert data["total"] == 3 # There should be 3 books in this library + + +async def test_list_books_with_tag_filter( + populated_authenticated_client: AsyncClient, +) -> None: + """Test listing books filtered by tags.""" + + response = await populated_authenticated_client.get("/books?library_id=1&tags=1") + + assert response.status_code == 200 + + result = response.json() + assert len(result["items"]) == 2 # Two books with the "Mystery" tag + + +async def test_list_books_with_author_filter( + populated_authenticated_client: AsyncClient, +) -> None: + """Test listing books filtered by authors.""" + response = await populated_authenticated_client.get("/books?library_id=1&authors=1") + + assert response.status_code == 200 + + result = response.json() + assert len(result["items"]) == 1 # One book by "Arthur Conan Doyle" + + +async def test_list_books_with_search( + populated_authenticated_client: AsyncClient, +) -> None: + """Test listing books with title search.""" + response = await populated_authenticated_client.get( + "/books?library_id=1&searchString=frankenstein" + ) + + assert response.status_code == 200 + + result = response.json() + assert len(result["items"]) == 1 # One matching book + + +async def test_delete_book_metadata_only( + populated_authenticated_client: AsyncClient, +) -> None: + """Test deleting a book record without deleting files.""" + + # Delete book without deleting files + response = await populated_authenticated_client.delete( + f"/books?book_ids=3&delete_files=false&library_id=1" + ) + + assert response.status_code == 204 + + # Verify book is deleted + get_response = await populated_authenticated_client.get(f"/books/3") + assert get_response.status_code == 404 + + +async def test_delete_book_with_files( + populated_authenticated_client: AsyncClient, +) -> None: + """Test deleting a book and its associated files.""" + + # Delete book and files + response = await populated_authenticated_client.delete( + f"/books?book_ids=3&delete_files=true&library_id=1" + ) + + assert response.status_code == 204 + + +async def test_delete_specific_book_files( + populated_authenticated_client: AsyncClient, +) -> None: + """Test deleting specific files from a book.""" + + # Delete specific file + response = await populated_authenticated_client.delete( + f"/books/1/files?file_ids=1", + ) + + assert response.status_code == 204 + + +async def test_update_reading_progress( + populated_authenticated_client: AsyncClient, +) -> None: + """Test updating reading progress for a book.""" + + # Update progress + progress_data = { + "progress": 0.5, + } + + response = await populated_authenticated_client.post( + f"/books/progress/1", + json=progress_data, + ) + + assert response.status_code == 201 + + # Get the book and check if the progress is correct + response = await populated_authenticated_client.get("/books/1") + + assert response.status_code == 200 + + book = response.json() + assert book["progress"]["progress"] == 0.5 + + +async def test_create_multiple_books_from_directory( + authenticated_client: AsyncClient, +) -> None: + """Test creating multiple books from a directory of files.""" + path1 = Path("tests/data_files/Metamorphosis - Franz Kafka.epub") + path2 = Path("tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub") + + files = [ + ("files", (path1.name, path1.read_bytes(), "application/epub+zip")), + ("files", (path2.name, path2.read_bytes(), "application/epub+zip")), + ] + + response = await authenticated_client.post( + "/books/fromFiles?library_id=1", + files=files, + data={"library_id": 1}, + ) + + assert response.status_code == 201 + data = response.json() + assert len(data.get("items") or data.get("data")) >= 1 + + +# async def test_delete_book_metadata(authenticated_client: AsyncClient) -> None: +# raise NotImplementedError() + + +# async def test_delete_book_metadata_and_files( +# authenticated_client: AsyncClient, +# ) -> None: +# raise NotImplementedError() + + +# async def test_edit_book_metadata(authenticated_client: AsyncClient) -> None: +# raise NotImplementedError() + +import pytest +import aiofiles +from httpx import AsyncClient +from pathlib import Path +from litestar.status_codes import HTTP_400_BAD_REQUEST + +import pytest +from httpx import AsyncClient +from datetime import date + + +class TestMetadataUpdates: + @pytest.mark.parametrize( + ("updated_field", "new_value"), + [ + ("title", "New Title"), + ("subtitle", "Updated Subtitle"), + ("pages", 256), + ("description", "An updated description"), + ("edition", 2), + ("language", "pl"), + ("published_date", "1910-04-05"), + ("series_position", "3"), + ], + ) + async def test_update_single_scalar_field( + self, + populated_authenticated_client: AsyncClient, + updated_field: str, + new_value: str, + ) -> None: + """Test updating a single field without affecting others.""" + + # Get original book state + original_response = await populated_authenticated_client.get("/books/1") + assert original_response.status_code == 200 + original_data = original_response.json() + + # Update field + response = await populated_authenticated_client.patch( + "/books/1", + json={updated_field: str(new_value)}, + ) + assert response.status_code == 200 + + updated_data = response.json() + + # Verify updated field + assert updated_data[updated_field] == new_value + + # Verify all other fields remain unchanged + for field, original_value in original_data.items(): + if field != updated_field and field not in ["updated_at", "created_at"]: + assert updated_data[field] == original_value, ( + f"Field {field} was unexpectedly changed" + ) + + @pytest.mark.parametrize( + ("updated_field", "new_values", "assertion_func"), + [ + ( + "authors", # Update with new authors + ["New Author 1", "New Author 2"], + lambda data: {a["name"] for a in data["authors"]} + == {"New Author 1", "New Author 2"}, + ), + ( + "authors", # Clear authors + [], + lambda data: data["authors"] == [], + ), + ( + "tags", # Update with new tags + ["Tag 1", "Tag 2", "Tag 3"], + lambda data: {t["name"] for t in data["tags"]} + == {"Tag 1", "Tag 2", "Tag 3"}, + ), + ( + "tags", # Clear tags + [], + lambda data: data["tags"] == [], + ), + ( + "publisher", # Update with new publisher + "Updated Publisher", + lambda data: data["publisher"]["name"] == "Updated Publisher", + ), + ( + "publisher", # Clear publisher + None, + lambda data: data["publisher"] is None, + ), + ( + "identifiers", # Update with new identifiers + {"isbn-13": "978-1234567890", "doi": "10.example/id"}, + lambda data: data["identifiers"] + == {"isbn-13": "978-1234567890", "doi": "10.example/id"}, + ), + ( + "identifiers", # Clear identifiers + {}, + lambda data: data["identifiers"] == {}, + ), + ( + "series", # Update with new series + "Updated Series", + lambda data: data["series"]["title"] == "Updated Series", + ), + ( + "series", # Clear series + None, + lambda data: data["series"] is None, + ), + ], + ) + async def test_update_relationship_fields( + self, + populated_authenticated_client: AsyncClient, + updated_field: str, + new_values: list[str], + assertion_func, + ) -> None: + """Test updating relationship fields (authors, tags, etc.)""" + + # Get original book state + original_response = await populated_authenticated_client.get("/books/1") + assert original_response.status_code == 200 + original_data = original_response.json() + + response = await populated_authenticated_client.patch( + "/books/1", + json={updated_field: new_values}, + ) + assert response.status_code == 200 + + # Verify updated field + updated_data = response.json() + assert assertion_func(updated_data) + + # Verify all other fields remain unchanged + for field, original_value in original_data.items(): + if field != updated_field and field not in ["updated_at", "created_at"]: + assert updated_data[field] == original_value, ( + f"Field {field} was unexpectedly changed" + ) + + async def test_update_with_invalid_pages_value( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating with invalid pages value (non-integer).""" + data = { + "pages": "not_a_number", + } + + response = await populated_authenticated_client.patch( + "/books/1", + files=data, + ) + assert response.status_code == 400 + + async def test_update_with_invalid_edition_value( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating with invalid edition value (non-integer).""" + data = { + "edition": "invalid_edition", + } + + response = await populated_authenticated_client.patch( + "/books/1", + files=data, + ) + assert response.status_code == 400 + + async def test_update_with_invalid_date_format( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating with invalid published_date format.""" + data = { + "published_date": "invalid-date", + } + + response = await populated_authenticated_client.patch( + "/books/1", + files=data, + ) + assert response.status_code == 400 + + async def test_update_with_invalid_identifiers_json( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating with invalid JSON in identifiers.""" + data = { + "identifiers": "not valid json", + } + + response = await populated_authenticated_client.patch( + "/books/1", + files=data, + ) + assert response.status_code == 400 + + async def test_update_multiple_fields_at_once( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating multiple fields simultaneously.""" + data = { + "title": "New Title", + "description": "New description", + "publisher": "New Publisher", + "pages": 430, + } + + response = await populated_authenticated_client.patch( + "/books/1", + json=data, + ) + assert response.status_code == 200 + + book_data = response.json() + assert book_data["title"] == "New Title" + assert book_data["description"] == "New description" + assert book_data["publisher"]["name"] == "New Publisher" + assert book_data["pages"] == 430 + + async def test_update_nonexistent_book( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test updating a nonexistent book returns 404.""" + data = { + "title": "New Title", + } + + response = await populated_authenticated_client.patch( + "/books/99999", + json=data, + ) + assert response.status_code == 404 + assert "book does not exist" in response.text + + @pytest.mark.parametrize( + ("updated_field"), + [ + ("subtitle"), + ("pages"), + ("description"), + ("edition"), + ("language"), + ("published_date"), + ("series_position"), + ], + ) + async def test_update_clears_optional_field( + self, populated_authenticated_client: AsyncClient, updated_field: str + ) -> None: + """Test that optional fields can be cleared by passing None or empty values.""" + + data = {updated_field: None} + + response = await populated_authenticated_client.patch( + "/books/1", + json=data, + ) + assert response.status_code == 200 + + result = response.json() + + assert result[updated_field] == None + + @pytest.mark.parametrize( + ("updated_field"), + [ + ("title"), + ], + ) + async def test_update_clears_required_field( + self, populated_authenticated_client: AsyncClient, updated_field: str + ) -> None: + """Test that optional fields can be cleared by passing None or empty values.""" + + data = {updated_field: None} + + response = await populated_authenticated_client.patch( + "/books/1", + json=data, + ) + assert response.status_code == 400 + + async def test_update_cover_successfully( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test successfully updating a book's cover image.""" + path = Path("tests/data_files/cover.jpg") + file_content = path.read_bytes() + + files = {"cover_image": (path.name, file_content, "image/jpeg")} + + # Get original book state + original_response = await populated_authenticated_client.get("/books/1") + assert original_response.status_code == 200 + original_data = original_response.json() + + response = await populated_authenticated_client.put( + "/books/1/cover", + files=files, + ) + assert response.status_code == 200 + + book_data = response.json() + assert book_data["id"] == 1 + + assert book_data["cover_image"] is not None + assert book_data["cover_image"] != original_data["cover_image"] + + +class TestFileManagement: + async def test_add_multiple_files_to_book( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test adding multiple files to a book in a single request.""" + path1 = Path("tests/data_files/Metamorphosis - Franz Kafka.epub") + path2 = Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf") + + file1_content = path1.read_bytes() + file2_content = path2.read_bytes() + + files = [ + ("files", (path1.name, file1_content, "application/epub+zip")), + ("files", (path2.name, file2_content, "application/pdf")), + ] + + response = await populated_authenticated_client.post( + "/books/1/files", + files=files, + ) + assert response.status_code == 201 + + book_data = response.json() + assert len(book_data["files"]) >= 2 + + async def test_add_files_to_nonexistent_book( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test adding files to a nonexistent book returns 404.""" + path = Path("tests/data_files/Metamorphosis - Franz Kafka.epub") + file_content = path.read_bytes() + files = [("files", (path.name, file_content, "application/epub+zip"))] + + response = await populated_authenticated_client.post( + "/books/99999/files?library_id=1", + files=files, + ) + assert response.status_code == 404 + + async def test_remove_multiple_files_at_once( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test removing multiple files from a book at once.""" + # First add multiple files + path1 = Path("tests/data_files/Metamorphosis - Franz Kafka.epub") + path2 = Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf") + + files = [ + ("files", (path1.name, path1.read_bytes(), "application/epub+zip")), + ("files", (path2.name, path2.read_bytes(), "application/pdf")), + ] + + add_response = await populated_authenticated_client.post( + "/books/1/files", + files=files, + ) + assert add_response.status_code == 201 + + book_data = add_response.json() + file_ids = [f["id"] for f in book_data["files"]] + + # Remove multiple files + response = await populated_authenticated_client.delete( + f"/books/1/files?file_ids={file_ids[0]}&file_ids={file_ids[1]}&delete_files=false", + ) + assert response.status_code == 204 + + # Verify files were removed + book = await populated_authenticated_client.get("/books/1") + book_data = book.json() + assert len(book_data["files"]) < len(file_ids) + + async def test_remove_zero_files_raises_error( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test error when trying to remove zero files.""" + response = await populated_authenticated_client.delete( + "/books/1/files?delete_files=false", + ) + assert response.status_code == HTTP_400_BAD_REQUEST + assert "missing required query parameter 'file_ids'" in response.text.lower() + + async def test_remove_files_from_nonexistent_book( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test removing files from a nonexistent book returns 404.""" + response = await populated_authenticated_client.delete( + "/books/99999/files?file_ids=1&delete_files=false&library_id=1", + ) + assert response.status_code == 404 + + async def test_remove_nonexistent_file_id_from_book( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test removing a file_id that doesn't exist on that book.""" + # Try to remove a file that doesn't belong to this book + response = await populated_authenticated_client.delete( + "/books/1/files?file_ids=99999&delete_files=false", + ) + # Should succeed (idempotent) or return 404, depending on implementation + assert response.status_code in [204, 404] + + async def test_remove_file_with_delete_files_false_keeps_filesystem_file( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test that removing with delete_files=false keeps file on disk.""" + # Get the book to retrieve file info + book_response = await populated_authenticated_client.get("/books/1") + book_data = book_response.json() + + if not book_data["files"]: + pytest.skip("Book has no files") + + file_id = book_data["files"][0]["id"] + filename = book_data["files"][0].get("path") + + # Remove file without deleting from filesystem + response = await populated_authenticated_client.delete( + f"/books/1/files?file_ids={file_id}&delete_files=false", + ) + assert response.status_code == 204 + + async def test_remove_file_with_delete_files_true_removes_filesystem_file( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test that removing with delete_files=true deletes from filesystem.""" + # Add a new file first + path = Path("tests/data_files/Calculus Made Easy - Silvanus Thompson.pdf") + file_content = path.read_bytes() + files = [("files", (path.name, file_content, "application/pdf"))] + + add_response = await populated_authenticated_client.post( + "/books/1/files", + files=files, + ) + assert add_response.status_code == 201 + + book_data = add_response.json() + file_id = book_data["files"][-1]["id"] + file_path = book_data["files"][-1].get("path") + + # Remove file with deletion from filesystem + response = await populated_authenticated_client.delete( + f"/books/1/files?file_ids={file_id}&delete_files=true", + ) + assert response.status_code == 204 + + async def test_remove_file_idempotent( + self, populated_authenticated_client: AsyncClient + ) -> None: + """Test that removing the same file twice doesn't error on second attempt.""" + book_response = await populated_authenticated_client.get("/books/1") + book_data = book_response.json() + + if not book_data["files"]: + pytest.skip("Book has no files") + + file_id = book_data["files"][0]["id"] + + # Remove file first time + response1 = await populated_authenticated_client.delete( + f"/books/1/files?file_ids={file_id}&delete_files=false", + ) + assert response1.status_code == 204 + + # Try to remove same file again + response2 = await populated_authenticated_client.delete( + f"/books/1/files?file_ids={file_id}&delete_files=false", + ) + # Should succeed (idempotent) + assert response2.status_code == 204 diff --git a/backend/tests/integration/test_bookshelf.py b/backend/tests/integration/test_bookshelf.py new file mode 100644 index 0000000..6822165 --- /dev/null +++ b/backend/tests/integration/test_bookshelf.py @@ -0,0 +1,286 @@ +import pytest +from httpx import AsyncClient + + +async def test_get_shelves_without_auth(client: AsyncClient) -> None: + response = await client.get("/shelves") + assert response.status_code == 401 + + +async def test_get_shelves_with_auth(authenticated_client: AsyncClient) -> None: + response = await authenticated_client.get("/shelves") + assert response.status_code == 200 + + result = response.json() + assert len(result["items"]) == 0 + + +async def test_get_existing_shelves( + populated_authenticated_client: AsyncClient, +) -> None: + response = await populated_authenticated_client.get("/shelves") + assert response.status_code == 200 + + result = response.json() + assert len(result["items"]) == 1 + + +async def test_create_shelf(authenticated_client: AsyncClient) -> None: + shelf_data = {"title": "Favourites"} + + response = await authenticated_client.post("/shelves", json=shelf_data) + + assert response.status_code == 201 + + result = response.json() + + assert result["title"] == "Favourites" + assert result["library_id"] is None + + +async def test_create_shelf_in_nonexistent_library( + authenticated_client: AsyncClient, +) -> None: + shelf_data = {"title": "Favourites", "library_id": 5} + + response = await authenticated_client.post("/shelves", json=shelf_data) + + assert response.status_code == 400 + assert f"Library with ID {shelf_data['library_id']} does not exist" in response.text + + +async def test_create_shelf_in_existing_library( + authenticated_client: AsyncClient, +) -> None: + shelf_data = {"title": "Favourites", "library_id": 1} + + response = await authenticated_client.post("/shelves", json=shelf_data) + + assert response.status_code == 201 + + result = response.json() + + assert result["title"] == "Favourites" + assert result["library_id"] == 1 + + +async def test_delete_shelf_without_auth(client: AsyncClient) -> None: + response = await client.delete("/shelves/1") + assert response.status_code == 401 + + +async def test_delete_shelf_unauthorized( + authenticated_client: AsyncClient, other_authenticated_client: AsyncClient +) -> None: + """Verify users can't delete shelves they don't own.""" + # Create a shelf as authenticated_client + shelf_data = {"title": "My Shelf"} + shelf_response = await authenticated_client.post("/shelves", json=shelf_data) + shelf_id = shelf_response.json()["id"] + + # Try to delete as other_authenticated_client + response = await other_authenticated_client.delete(f"/shelves/{shelf_id}") + assert response.status_code == 403 + assert "do not have permission" in response.text + + +async def test_add_books_unauthorized( + authenticated_client: AsyncClient, other_authenticated_client: AsyncClient +) -> None: + """Verify users can't add books to shelves they don't own.""" + # Create a shelf as authenticated_client + shelf_data = {"title": "Other User's Shelf"} + shelf_response = await authenticated_client.post("/shelves", json=shelf_data) + shelf_id = shelf_response.json()["id"] + + # Try to add books as other_authenticated_client + response = await other_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": [1, 2]} + ) + assert response.status_code == 403 + assert "do not have permission" in response.text + + +async def test_remove_books_unauthorized( + authenticated_client: AsyncClient, other_authenticated_client: AsyncClient +) -> None: + """Verify users can't remove books from shelves they don't own.""" + # Create a shelf and add books as authenticated_client + shelf_data = {"title": "Other User's Shelf"} + shelf_response = await authenticated_client.post("/shelves", json=shelf_data) + shelf_id = shelf_response.json()["id"] + + await authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": [1, 2]} + ) + + # Try to remove books as other_authenticated_client + response = await other_authenticated_client.delete( + f"/shelves/{shelf_id}/books", params={"book_ids": [1]} + ) + assert response.status_code == 403 + assert "do not have permission" in response.text + + +async def test_delete_nonexistent_shelf(authenticated_client: AsyncClient) -> None: + """Verify 404 when deleting a shelf that doesn't exist.""" + response = await authenticated_client.delete("/shelves/99999") + assert response.status_code == 404 + + +async def test_add_books_to_shelf(populated_authenticated_client: AsyncClient) -> None: + """Successfully add books to a shelf.""" + shelf_data = {"title": "Test Shelf"} + shelf_response = await populated_authenticated_client.post( + "/shelves", json=shelf_data + ) + shelf_id = shelf_response.json()["id"] + + book_ids = [1, 2] + response = await populated_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": book_ids} + ) + assert response.status_code == 201 + + # Verify by listing books filtered by shelf + books_response = await populated_authenticated_client.get( + "/books", params={"shelves": shelf_id} + ) + assert books_response.status_code == 200 + assert len(books_response.json()["items"]) == 2 + + +async def test_add_books_to_nonexistent_shelf( + authenticated_client: AsyncClient, +) -> None: + """Verify 404 when adding to nonexistent shelf.""" + response = await authenticated_client.post( + "/shelves/99999/books", params={"book_ids": [1, 2]} + ) + assert response.status_code == 404 + + +async def test_add_nonexistent_books(authenticated_client: AsyncClient) -> None: + """Verify appropriate error when book IDs don't exist.""" + shelf_data = {"title": "Test Shelf"} + shelf_response = await authenticated_client.post("/shelves", json=shelf_data) + shelf_id = shelf_response.json()["id"] + + response = await authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": [99999, 99998]} + ) + + assert response.status_code == 400 + + +async def test_remove_books_from_shelf( + populated_authenticated_client: AsyncClient, +) -> None: + """Successfully remove books from a shelf.""" + shelf_data = {"title": "Test Shelf"} + shelf_response = await populated_authenticated_client.post( + "/shelves", json=shelf_data + ) + shelf_id = shelf_response.json()["id"] + + # Add books first + book_ids = [1, 2, 3] + await populated_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": book_ids} + ) + + # Remove one book + response = await populated_authenticated_client.delete( + f"/shelves/{shelf_id}/books", params={"book_ids": [1]} + ) + assert response.status_code == 200 + + # Verify by listing books + books_response = await populated_authenticated_client.get( + "/books", params={"shelves": shelf_id} + ) + + + assert books_response.status_code == 200 + assert books_response.json()["total"] == 2 + + +async def test_remove_books_from_nonexistent_shelf( + authenticated_client: AsyncClient, +) -> None: + """Verify 404 when removing from nonexistent shelf.""" + response = await authenticated_client.delete( + "/shelves/99999/books", params={"book_ids": [1, 2]} + ) + assert response.status_code == 404 + + +async def test_remove_nonexistent_books( + populated_authenticated_client: AsyncClient, +) -> None: + """Verify appropriate error handling when removing nonexistent books.""" + shelf_data = {"title": "Test Shelf"} + shelf_response = await populated_authenticated_client.post( + "/shelves", json=shelf_data + ) + shelf_id = shelf_response.json()["id"] + + # Add a book first + await populated_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": [1]} + ) + + # Try to remove books that don't exist on shelf + response = await populated_authenticated_client.delete( + f"/shelves/{shelf_id}/books", params={"book_ids": [99999]} + ) + + # Idempotent behaviour + assert response.status_code == 200 + + +async def test_add_duplicate_books(populated_authenticated_client: AsyncClient) -> None: + """Verify behavior when adding books already on shelf.""" + shelf_data = {"title": "Test Shelf"} + shelf_response = await populated_authenticated_client.post( + "/shelves", json=shelf_data + ) + shelf_id = shelf_response.json()["id"] + + # Add books + book_ids = [1, 2] + await populated_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": book_ids} + ) + + # Try to add some of the same books again + response = await populated_authenticated_client.post( + f"/shelves/{shelf_id}/books", params={"book_ids": [1, 2, 3]} + ) + + assert response.status_code == 201 + + # Verify final state + books_response = await populated_authenticated_client.get( + "/books", params={"shelves": shelf_id} + ) + result = books_response.json()["items"] + + assert len(result) == 3 + + +async def test_create_shelf_with_empty_title(authenticated_client: AsyncClient) -> None: + """Verify validation rejects empty shelf titles.""" + shelf_data = {"title": ""} + response = await authenticated_client.post("/shelves", json=shelf_data) + assert response.status_code == 400 + assert "title" in response.text.lower() + + +async def test_create_shelf_with_whitespace_only_title( + authenticated_client: AsyncClient, +) -> None: + """Verify validation rejects whitespace-only titles.""" + shelf_data = {"title": " "} + response = await authenticated_client.post("/shelves", json=shelf_data) + assert response.status_code == 400 diff --git a/backend/tests/integration/test_library.py b/backend/tests/integration/test_library.py new file mode 100644 index 0000000..e2908ec --- /dev/null +++ b/backend/tests/integration/test_library.py @@ -0,0 +1,44 @@ +import pytest +from httpx import AsyncClient +from pathlib import Path + + +async def test_get_libraries_without_auth(client: AsyncClient) -> None: + response = await client.get("/libraries?library_id=1") + assert response.status_code == 401 + + +async def test_get_libraries_with_auth(authenticated_client: AsyncClient) -> None: + response = await authenticated_client.get("/libraries?library_id=1") + assert response.status_code == 200 + + +@pytest.mark.parametrize( + ("name", "read_only", "expected_status_code"), + [("Test Library", False, 201), ("Read-Only Library", True, 400)], +) +async def test_create_library( + authenticated_client: AsyncClient, + tmp_path: Path, + name: str, + read_only: bool, + expected_status_code: int, +) -> None: + library_data = { + "name": "Test Library", + "root_path": f"{tmp_path}/books", + "path_template": "{author}/{title}", + "read_only": read_only, + } + + response = await authenticated_client.post("/libraries", json=library_data) + + assert response.status_code == expected_status_code + + if response.status_code == 201: + result = response.json() + assert result["name"] == "Test Library" + assert result["root_path"] == f"{tmp_path}/books" + assert result["path_template"] == "{author}/{title}" + assert result["read_only"] == False + assert result["description"] is None diff --git a/backend/tests/unit/test_metadata_extractor.py b/backend/tests/unit/test_metadata_extractor.py new file mode 100644 index 0000000..d8335cc --- /dev/null +++ b/backend/tests/unit/test_metadata_extractor.py @@ -0,0 +1,17 @@ +import pytest +from pathlib import Path +from datetime import date +from chitai.services.metadata_extractor import EpubExtractor + + +@pytest.mark.asyncio() +class TestEpubExtractor: + async def test_extraction_by_path(self): + path = Path("tests/data_files/Moby Dick; Or, The Whale - Herman Melville.epub") + + metadata = await EpubExtractor.extract_metadata(path) + + assert metadata["title"] == "Moby Dick; Or, The Whale" + assert metadata["authors"] == ["Herman Melville"] + assert metadata["published_date"] == date(year=2001, month=7, day=1) + diff --git a/backend/tests/unit/test_services/test_book_service.py b/backend/tests/unit/test_services/test_book_service.py new file mode 100644 index 0000000..fcdca5f --- /dev/null +++ b/backend/tests/unit/test_services/test_book_service.py @@ -0,0 +1,74 @@ +"""Tests for BookService""" + +import pytest + +from pathlib import Path + + +import aiofiles.os as aios + +from chitai.schemas import BookCreate +from chitai.services import BookService +from chitai.database import models as m + + +@pytest.mark.asyncio +class TestBookServiceCRUD: + """Test CRUD operation for libraries.""" + + async def test_update_book( + self, books_service: BookService, test_library: m.Library + ) -> None: + book_data = BookCreate( + library_id=1, + title="Fellowship of the Ring", + authors=["J.R.R Tolkien"], + tags=["Fantasy"], + identifiers={"isbn-13": "9780261102354"}, + pages=427, + ) + + book = await books_service.to_model_on_create(book_data.model_dump()) + + # Add path manually as it won't be generated (not using the create function, but manually inserting into db) + book.path = f"{test_library.root_path}/J.R.R Tolkien/The Fellowship of the Ring" + await aios.makedirs(book.path) + + books_service.repository.session.add(book) + await books_service.repository.session.commit() + await books_service.repository.session.refresh(book) + + await books_service.update( + book.id, + { + "title": "The Fellowship of the Ring", + "identifiers": {"isbn-10": "9780261102354"}, + "edition": 3, + "publisher": "Tolkien Estate", + "series": "The Lord of the Rings", + "series_position": "1", + "tags": ["Fantasy", "Adventure"], + }, + test_library, + ) + + updated_book = await books_service.get(book.id) + + # Assert updated information is correct + + assert updated_book.title == "The Fellowship of the Ring" + assert ( + updated_book.path + == f"{test_library.root_path}/J.R.R Tolkien/The Lord of the Rings/01 - The Fellowship of the Ring" + ) + + assert len(updated_book.identifiers) + assert updated_book.identifiers[0].value == "9780261102354" + + assert updated_book.edition == 3 + assert updated_book.publisher.name == "Tolkien Estate" + + assert len(updated_book.tags) == 2 + + +# book = await books_service.create(book_data.model_dump()) diff --git a/backend/tests/unit/test_services/test_bookshelf_service.py b/backend/tests/unit/test_services/test_bookshelf_service.py new file mode 100644 index 0000000..919e9bb --- /dev/null +++ b/backend/tests/unit/test_services/test_bookshelf_service.py @@ -0,0 +1,298 @@ +"""Tests for LibraryService""" + +import pytest + +from sqlalchemy.ext.asyncio import AsyncSession + +from chitai.services import ShelfService +from chitai.database import models as m + + +import pytest +from sqlalchemy import select + +from chitai.services.bookshelf import ShelfService +from chitai.services import BookService +from chitai.database.models.book_list import BookList, BookListLink +from chitai.database import models as m + + +@pytest.fixture +async def db_session(bookshelf_service: ShelfService) -> AsyncSession: + return bookshelf_service.repository.session + + +@pytest.fixture(autouse=True) +async def test_books(db_session: AsyncSession) -> list[m.Book]: + """Create test books in the database.""" + + library = m.Library( + name="Default Library", + slug="default-library", + root_path="./path", + path_template="{author}/{title}", + read_only=False, + ) + + db_session.add(library) + + books = [m.Book(title=f"Book {i}", library_id=1) for i in range(1, 8)] + db_session.add_all(books) + + user = m.User(email="test_user@example.com", password="password123") + db_session.add(user) + + await db_session.flush() + await db_session.commit() + return books + + +class TestAddBooks: + async def test_add_books_to_empty_shelf( + self, bookshelf_service: ShelfService, db_session + ) -> None: + """Successfully add books to an empty shelf.""" + # Create a shelf + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Add books + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + + # Verify books were added + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + added_links = links.scalars().all() + assert len(added_links) == 3 + assert {link.book_id for link in added_links} == {1, 2, 3} + + async def test_add_books_preserves_positions( + self, bookshelf_service: ShelfService, db_session + ) -> None: + """Verify books are assigned correct positions on the shelf.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + + links = await db_session.execute( + select(BookListLink) + .where(BookListLink.list_id == shelf.id) + .order_by(BookListLink.position) + ) + added_links = links.scalars().all() + + # Verify positions are sequential starting from 0 + assert [link.position for link in added_links] == [0, 1, 2] + + async def test_add_books_to_shelf_with_existing_books( + self, bookshelf_service: ShelfService, db_session + ) -> None: + """Adding books to a shelf with existing books assigns correct positions.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Add initial books + await bookshelf_service.add_books(shelf.id, [1, 2]) + + # Add more books + await bookshelf_service.add_books(shelf.id, [3, 4]) + + links = await db_session.execute( + select(BookListLink) + .where(BookListLink.list_id == shelf.id) + .order_by(BookListLink.position) + ) + added_links = links.scalars().all() + + # Verify new books continue from position 2 + assert len(added_links) == 4 + assert [link.position for link in added_links] == [0, 1, 2, 3] + + async def test_add_duplicate_books_is_idempotent( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Adding books already on shelf should not create duplicates.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Add books + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + + # Try to add overlapping books + await bookshelf_service.add_books(shelf.id, [2, 3, 4]) + + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + added_links = links.scalars().all() + + # Should have 4 books total (1, 2, 3, 4), not 7 + assert len(added_links) == 4 + assert {link.book_id for link in added_links} == {1, 2, 3, 4} + + async def test_add_books_raises_on_nonexistent_shelf( + self, bookshelf_service: ShelfService + ) -> None: + """Adding books to nonexistent shelf raises error.""" + with pytest.raises(Exception): # Could be SQLAlchemyError or specific error + await bookshelf_service.add_books(99999, [1, 2, 3]) + + async def test_add_nonexistent_books_raises_error( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Adding nonexistent books raises ValueError.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + with pytest.raises(ValueError, match="One or more books not found"): + await bookshelf_service.add_books(shelf.id, [99999, 99998]) + + async def test_add_partial_nonexistent_books_raises_error( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Adding a mix of existent and nonexistent books raises error.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Book 1 might exist, but 99999 doesn't + with pytest.raises(ValueError, match="One or more books not found"): + await bookshelf_service.add_books(shelf.id, [1, 99999]) + + async def test_add_empty_book_list( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Adding empty book list should return without error.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Should not raise + await bookshelf_service.add_books(shelf.id, []) + + +class TestRemoveBooks: + async def test_remove_books_from_shelf( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Successfully remove books from a shelf.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Add books + await bookshelf_service.add_books(shelf.id, [1, 2, 3, 4]) + + # Remove some books + await bookshelf_service.remove_books(shelf.id, [2, 3]) + + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + remaining_links = links.scalars().all() + + assert len(remaining_links) == 2 + assert {link.book_id for link in remaining_links} == {1, 4} + + async def test_remove_all_books_from_shelf( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Removing all books should leave shelf empty.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + await bookshelf_service.remove_books(shelf.id, [1, 2, 3]) + + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + remaining_links = links.scalars().all() + + assert len(remaining_links) == 0 + + async def test_remove_nonexistent_book_is_idempotent( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Removing books not on shelf should not raise error.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + + # Remove books that don't exist on shelf - should not raise + await bookshelf_service.remove_books(shelf.id, [99, 100]) + + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + remaining_links = links.scalars().all() + + # Original books should still be there + assert len(remaining_links) == 3 + + async def test_remove_books_raises_on_nonexistent_shelf( + self, bookshelf_service: ShelfService + ) -> None: + """Removing books from nonexistent shelf raises error.""" + with pytest.raises(Exception): + await bookshelf_service.remove_books(99999, [1, 2, 3]) + + async def test_remove_empty_book_list( + self, bookshelf_service: ShelfService, db_session: AsyncSession + ) -> None: + """Removing empty book list should return without error.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + await bookshelf_service.add_books(shelf.id, [1, 2, 3]) + + # Should not raise + await bookshelf_service.remove_books(shelf.id, []) + + links = await db_session.execute( + select(BookListLink).where(BookListLink.list_id == shelf.id) + ) + remaining_links = links.scalars().all() + + # All books should still be there + assert len(remaining_links) == 3 + + async def test_add_remove_add_sequence( + self, bookshelf_service: ShelfService, db_session + ) -> None: + """Add books, remove from middle, then add more - positions should be maintained.""" + shelf = BookList(title="Test Shelf", user_id=1) + db_session.add(shelf) + await db_session.flush() + + # Add initial books [1, 2, 3, 4, 5] + await bookshelf_service.add_books(shelf.id, [1, 2, 3, 4, 5]) + + # Remove books from middle [2, 3, 4] + await bookshelf_service.remove_books(shelf.id, [2, 3, 4]) + + # Add more books [6, 7] + await bookshelf_service.add_books(shelf.id, [6, 7]) + + links = await db_session.execute( + select(BookListLink) + .where(BookListLink.list_id == shelf.id) + .order_by(BookListLink.position) + ) + final_links = links.scalars().all() + + # Should have [1, 5, 6, 7] with positions [0, 1, 2, 3] + assert len(final_links) == 4 + assert [link.book_id for link in final_links] == [1, 5, 6, 7] + assert [link.position for link in final_links] == [0, 1, 2, 3] diff --git a/backend/tests/unit/test_services/test_library_service.py b/backend/tests/unit/test_services/test_library_service.py new file mode 100644 index 0000000..b7af592 --- /dev/null +++ b/backend/tests/unit/test_services/test_library_service.py @@ -0,0 +1,153 @@ +"""Tests for LibraryService""" + +import pytest + +from pathlib import Path + +from sqlalchemy.ext.asyncio import AsyncSession + +from chitai.schemas.library import LibraryCreate +from chitai.services import LibraryService +from chitai.database import models as m +from chitai.services.utils import DirectoryDoesNotExist + + +@pytest.mark.asyncio +class TestLibraryServiceCRUD: + """Test CRUD operation for libraries.""" + + async def test_create_library( + self, library_service: LibraryService, tmp_path: Path + ) -> None: + """Test creating a library with a valid root path.""" + + library_path = f"{tmp_path}/books" + library_data = LibraryCreate( + name="Test Library", + root_path=library_path, + path_template="{author}/{title}", + read_only=False, + ) + + library = await library_service.create(library_data) + + assert library.name == "Test Library" + assert library.root_path == library_path + assert library.path_template == "{author}/{title}" + assert library.description == None + assert library.read_only == False + + # Check if directory was created + assert Path(library.root_path).is_dir() + + async def test_create_library_root_path_permission_error( + self, library_service: LibraryService, tmp_path: Path + ) -> None: + """Test creating a library with a root path that is not permitted.""" + + # Change permissions on the temp path + tmp_path.chmod(0o544) + + library_path = f"{tmp_path}/books" + library_data = LibraryCreate( + name="Test Library", + root_path=library_path, + path_template="{author}/{title}", + read_only=False, + ) + + with pytest.raises(PermissionError) as exc_info: + library = await library_service.create(library_data) + + # Check if directory was created + assert not Path(library_path).exists() + + # Change permissions back + tmp_path.chmod(0o755) + + async def test_create_library_read_only_path_exists( + self, library_service: LibraryService, tmp_path: Path + ) -> None: + """Test creating a read-only library with a root path that exists.""" + + # Create the path beforehand + library_path = f"{tmp_path}/books" + Path(library_path).mkdir() + + library_data = LibraryCreate( + name="Test Library", + root_path=library_path, + path_template="{author}/{title}", + read_only=True, + ) + + library = await library_service.create(library_data) + + assert library.name == "Test Library" + assert library.root_path == library_path + assert library.path_template == "{author}/{title}" + assert library.description == None + assert library.read_only == True + + async def test_create_library_read_only_nonexistent_path( + self, library_service: LibraryService, tmp_path: Path + ) -> None: + """Test creating a read-only library with a nonexistent root path.""" + + library_path = f"{tmp_path}/books" + library_data = LibraryCreate( + name="Test Library", + root_path=library_path, + path_template="{author}/{title}", + read_only=True, + ) + + with pytest.raises(DirectoryDoesNotExist) as exc_info: + await library_service.create(library_data) + + assert "Root directory" in str(exc_info.value) + assert "must exist for a read-only library" in str(exc_info.value) + + # Check if directory was created + assert not Path(library_path).exists() + + async def test_get_library( + self, session: AsyncSession, library_service: LibraryService + ) -> None: + """Test retrieving a library.""" + + # Add a library to the database + library_data = m.Library( + name="Testing Library", + slug="testing-library", + root_path="./books", + path_template="{author}/{title}", + description=None, + read_only=False, + ) + + session.add(library_data) + await session.commit() + await session.refresh(library_data) + + library = await library_service.get(library_data.id) + + assert library is not None + assert library.id == library_data.id + assert library.name == "Testing Library" + assert library.root_path == "./books" + assert library.path_template == "{author}/{title}" + assert library.description is None + assert library.read_only == False + + # async def test_delete_library_keep_files( + # self, session: AsyncSession, library_service: LibraryService + # ) -> None: + # """Test deletion of a library's metadata and associated entities.""" + # raise NotImplementedError() + + # async def test_delete_library_delete_files( + # self, session: AsyncSession, library_service: LibraryService + # ) -> None: + # """Test deletion of a library's metadata, associated enties, and files/directories.""" + # raise NotImplementedError() diff --git a/backend/tests/unit/test_services/test_user_service.py b/backend/tests/unit/test_services/test_user_service.py new file mode 100644 index 0000000..d83c26f --- /dev/null +++ b/backend/tests/unit/test_services/test_user_service.py @@ -0,0 +1,116 @@ +"""Tests for UserService""" + +import pytest + +from sqlalchemy.ext.asyncio import AsyncSession +from litestar.exceptions import PermissionDeniedException +from sqlalchemy.exc import IntegrityError + +from chitai.services import UserService +from chitai.database import models as m + + +@pytest.mark.asyncio +class TestUserServiceAuthentication: + """Test authentication functionality.""" + + async def test_authenticate_success( + self, session: AsyncSession, user_service: UserService + ) -> None: + """Test successful user authentication.""" + + # Create a user with a known password + password = "password123" + user = m.User(email=f"test@example.com", password=password) + + session.add(user) + await session.commit() + + # Authenticate user + authenticated_user = await user_service.authenticate( + "test@example.com", password + ) + + assert authenticated_user is not None + assert authenticated_user.email == "test@example.com" + assert authenticated_user.id == user.id + + async def test_authenticate_user_not_found( + self, session: AsyncSession, user_service: UserService + ) -> None: + """Test authentication with non-existent user.""" + + with pytest.raises(PermissionDeniedException) as exc_info: + await user_service.authenticate("nonexistent@example.com", "password") + + assert "User not found or password invalid" in str(exc_info.value) + + async def test_authenticate_wrong_password( + self, session: AsyncSession, user_service: UserService + ) -> None: + """Test authentication with wrong password.""" + + # Create user + password = "password123" + user = m.User(email=f"test@example.com", password=password) + + session.add(user) + await session.commit() + + # Attempt authentication + with pytest.raises(PermissionDeniedException) as exc_info: + await user_service.authenticate("test@example.com", "WrongPassword") + + assert "User not found or password invalid" in str(exc_info.value) + + +@pytest.mark.asyncio +class TestUserServiceCRUD: + """Test basic CRUD operations.""" + + async def test_create_user_with_password_hashing( + self, session: AsyncSession, user_service: UserService + ) -> None: + user_data = {"email": "newuser@example.com", "password": "password123"} + + user = await user_service.create(data=user_data) + + assert user.email == "newuser@example.com" + assert user.password is not None + assert user.password != "password123" # Password should be hashed + assert user.password.verify("password123") + + async def test_get_user_by_email( + self, session: AsyncSession, user_service: UserService + ) -> None: + """Test getting user by email.""" + + user = m.User(email=f"test@example.com", password="password123") + + session.add(user) + await session.commit() + + found_user = await user_service.get_one_or_none(email="test@example.com") + + assert found_user is not None + assert found_user.id == user.id + assert found_user.email == user.email + + async def test_create_user_with_duplicate_email( + self, session: AsyncSession, user_service: UserService + ) -> None: + """Test creating a new user with a duplicate email.""" + + # Create first user + user = m.User(email=f"test@example.com", password="password123") + session.add(user) + await session.commit() + + # Create second user + user = m.User(email=f"test@example.com", password="password12345") + + with pytest.raises(IntegrityError) as exc_info: + session.add(user) + await session.commit() + + assert "violates unique constraint" in str(exc_info.value) diff --git a/backend/uv.lock b/backend/uv.lock new file mode 100644 index 0000000..708954e --- /dev/null +++ b/backend/uv.lock @@ -0,0 +1,1468 @@ +version = 1 +revision = 2 +requires-python = ">=3.13" +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version < '3.14'", +] + +[[package]] +name = "advanced-alchemy" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alembic" }, + { name = "greenlet" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/c6/6b3b3abfaec99d4a803842591ca796f7b194bfe1e966e749e79fcc26f3b3/advanced_alchemy-1.8.0.tar.gz", hash = "sha256:2a4ff20e8f09c15472196623ab99870e99085466a7ca95aecea3b113f571e67b", size = 909668, upload-time = "2025-10-28T21:01:30.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/a3/9c1ffd384f8ed517d0961a230b92dc235b4be45027c57a5290f615358a2f/advanced_alchemy-1.8.0-py3-none-any.whl", hash = "sha256:df3fc0794f3b2288ac84f537e5d2918c70658116de4e2c2e2294778b179cfa70", size = 258817, upload-time = "2025-10-28T21:01:29.163Z" }, +] + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "alembic" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/45/6f4555f2039f364c3ce31399529dcf48dd60726ff3715ad67f547d87dfd2/alembic-1.17.0.tar.gz", hash = "sha256:4652a0b3e19616b57d652b82bfa5e38bf5dbea0813eed971612671cb9e90c0fe", size = 1975526, upload-time = "2025-10-11T18:40:13.585Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/1f/38e29b06bfed7818ebba1f84904afdc8153ef7b6c7e0d8f3bc6643f5989c/alembic-1.17.0-py3-none-any.whl", hash = "sha256:80523bc437d41b35c5db7e525ad9d908f79de65c27d6a5a5eab6df348a352d99", size = 247449, upload-time = "2025-10-11T18:40:16.288Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094, upload-time = "2025-09-23T09:19:12.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097, upload-time = "2025-09-23T09:19:10.601Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798, upload-time = "2023-08-15T14:13:12.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124, upload-time = "2023-08-15T14:13:10.752Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f", size = 54393, upload-time = "2025-07-30T10:01:40.97Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b", size = 29328, upload-time = "2025-07-30T10:01:41.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a", size = 31269, upload-time = "2025-07-30T10:01:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f", size = 28158, upload-time = "2025-07-30T10:01:48.341Z" }, + { url = "https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6", size = 32597, upload-time = "2025-07-30T10:01:49.112Z" }, + { url = "https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623", size = 28231, upload-time = "2025-07-30T10:01:49.92Z" }, + { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, +] + +[[package]] +name = "asyncpg" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/4c/7c991e080e106d854809030d8584e15b2e996e26f16aee6d757e387bc17d/asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851", size = 957746, upload-time = "2024-10-20T00:30:41.127Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/22/e20602e1218dc07692acf70d5b902be820168d6282e69ef0d3cb920dc36f/asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70", size = 670373, upload-time = "2024-10-20T00:29:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b3/0cf269a9d647852a95c06eb00b815d0b95a4eb4b55aa2d6ba680971733b9/asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3", size = 634745, upload-time = "2024-10-20T00:29:57.14Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/a4f31bf358ce8491d2a31bfe0d7bcf25269e80481e49de4d8616c4295a34/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33", size = 3512103, upload-time = "2024-10-20T00:29:58.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/19/139227a6e67f407b9c386cb594d9628c6c78c9024f26df87c912fabd4368/asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4", size = 3592471, upload-time = "2024-10-20T00:30:00.354Z" }, + { url = "https://files.pythonhosted.org/packages/67/e4/ab3ca38f628f53f0fd28d3ff20edff1c975dd1cb22482e0061916b4b9a74/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4", size = 3496253, upload-time = "2024-10-20T00:30:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5f/0bf65511d4eeac3a1f41c54034a492515a707c6edbc642174ae79034d3ba/asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba", size = 3662720, upload-time = "2024-10-20T00:30:04.501Z" }, + { url = "https://files.pythonhosted.org/packages/e7/31/1513d5a6412b98052c3ed9158d783b1e09d0910f51fbe0e05f56cc370bc4/asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590", size = 560404, upload-time = "2024-10-20T00:30:06.537Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a4/cec76b3389c4c5ff66301cd100fe88c318563ec8a520e0b2e792b5b84972/asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e", size = 621623, upload-time = "2024-10-20T00:30:09.024Z" }, +] + +[[package]] +name = "certifi" +version = "2025.10.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +] + +[[package]] +name = "chitai" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "advanced-alchemy" }, + { name = "aiofiles" }, + { name = "asyncpg" }, + { name = "ebooklib" }, + { name = "jinja2" }, + { name = "litestar", extra = ["jwt", "standard"] }, + { name = "passlib" }, + { name = "pillow" }, + { name = "pwdlib", extra = ["argon2"] }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pypdfium2" }, + { name = "watchfiles" }, + { name = "xmltodict" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-databases", extra = ["postgres"] }, +] + +[package.metadata] +requires-dist = [ + { name = "advanced-alchemy", specifier = "==1.8.0" }, + { name = "aiofiles", specifier = ">=24.1.0" }, + { name = "asyncpg", specifier = ">=0.30.0" }, + { name = "ebooklib", specifier = ">=0.19" }, + { name = "jinja2", specifier = ">=3.1.6" }, + { name = "litestar", extras = ["jwt", "standard"], specifier = ">=2.16.0" }, + { name = "passlib", specifier = ">=1.7.4" }, + { name = "pillow", specifier = ">=11.2.1" }, + { name = "pwdlib", extras = ["argon2"], specifier = ">=0.2.1" }, + { name = "pydantic", specifier = ">=2.11.5" }, + { name = "pydantic-settings", specifier = ">=2.9.1" }, + { name = "pypdfium2", specifier = ">=4.30.0" }, + { name = "watchfiles", specifier = ">=1.1.1" }, + { name = "xmltodict", specifier = ">=1.0.2" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.4.2" }, + { name = "pytest-asyncio", specifier = ">=1.2.0" }, + { name = "pytest-databases", extras = ["postgres"], specifier = ">=0.15.0" }, +] + +[[package]] +name = "click" +version = "8.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "46.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" }, + { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" }, + { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" }, + { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" }, + { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" }, + { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" }, + { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" }, + { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" }, + { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" }, + { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" }, + { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" }, + { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" }, + { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" }, + { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" }, + { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" }, + { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" }, + { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" }, + { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" }, + { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" }, + { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" }, + { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" }, + { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" }, + { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, + { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, +] + +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, +] + +[[package]] +name = "ebooklib" +version = "0.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/2a/0e7c1bdb83211043085f11c630ad7d7839dae56fd043188b59df7c1d0f69/ebooklib-0.19.tar.gz", hash = "sha256:07e9b4db0a30c73623b14e23b315634a450d2c13f23d1dba4b457a6ca16a58be", size = 116311, upload-time = "2025-05-02T13:17:58.607Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/59/e63fd0b3410d2ab7a8971b070f40390f1fbeb3c7a85849718c8480313cbf/ebooklib-0.19-py3-none-any.whl", hash = "sha256:a790e280e1d5ef105e350e34cc88b83c9c987fa6bab8a63a7543410c313cfa31", size = 39214, upload-time = "2025-05-02T13:17:57.332Z" }, +] + +[[package]] +name = "editorconfig" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/3a/a61d9a1f319a186b05d14df17daea42fcddea63c213bcd61a929fb3a6796/editorconfig-0.17.1.tar.gz", hash = "sha256:23c08b00e8e08cc3adcddb825251c497478df1dada6aefeb01e626ad37303745", size = 14695, upload-time = "2025-06-09T08:21:37.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/fd/a40c621ff207f3ce8e484aa0fc8ba4eb6e3ecf52e15b42ba764b457a9550/editorconfig-0.17.1-py3-none-any.whl", hash = "sha256:1eda9c2c0db8c16dbd50111b710572a5e6de934e39772de1959d41f64fc17c82", size = 16360, upload-time = "2025-06-09T08:21:35.654Z" }, +] + +[[package]] +name = "faker" +version = "37.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/4b/ca43f6bbcef63deb8ac01201af306388670a172587169aab3b192f7490f0/faker-37.11.0.tar.gz", hash = "sha256:22969803849ba0618be8eee2dd01d0d9e2cd3b75e6ff1a291fa9abcdb34da5e6", size = 1935301, upload-time = "2025-10-07T14:49:01.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/46/8f4097b55e43af39e8e71e1f7aec59ff7398bca54d975c30889bc844719d/faker-37.11.0-py3-none-any.whl", hash = "sha256:1508d2da94dfd1e0087b36f386126d84f8583b3de19ac18e392a2831a6676c57", size = 1975525, upload-time = "2025-10-07T14:48:58.29Z" }, +] + +[[package]] +name = "fast-query-parsers" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/20/3a00b889a196e8dc5bede2f168d4a14edc8b5bccc3978a9f497f0f863e79/fast_query_parsers-1.0.3.tar.gz", hash = "sha256:5200a9e02997ad51d4d76a60ea1b256a68a184b04359540eb6310a15013df68f", size = 25275, upload-time = "2023-08-25T13:19:15.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/18/4179ac7064b4216ca42f2ed6f74e71254454acf2ec25ce6bb3ffbfda4aa6/fast_query_parsers-1.0.3-cp38-abi3-macosx_10_7_x86_64.whl", hash = "sha256:afbf71c1b4398dacfb9d84755eb026f8e759f68a066f1f3cc19e471fc342e74f", size = 766210, upload-time = "2023-08-25T13:18:48.415Z" }, + { url = "https://files.pythonhosted.org/packages/c5/21/c8c160f61a740efc4577079eb5747a6b2cb8d1168a84a0bfda6044113768/fast_query_parsers-1.0.3-cp38-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:42f26875311d1b151c3406adfa39ec2db98df111a369d75f6fa243ec8462f147", size = 1466147, upload-time = "2023-08-25T13:18:50.29Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/b10719598dbd14201271efd0b950c6a09efa0a3f6246fec3c192c6b7a8d2/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66630ad423b5b1f5709f82a4d8482cd6aa2f3fa73d2c779ff1877f25dee08d55", size = 764016, upload-time = "2023-08-25T13:18:52.295Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/8861197982909bec00b180527df1e0e9791715271bfb84c8be389b6bf077/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6e3d816c572a6fad1ae9b93713b2db0d3db6e8f594e035ad52361d668dd94a8", size = 729912, upload-time = "2023-08-25T13:18:54.515Z" }, + { url = "https://files.pythonhosted.org/packages/f0/35/7a9a0c50588033edd9efba48f21e251dfcf77eaec2aff470988f622fbd3a/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0bdcc0ddb4cc69d823c2c0dedd8f5affc71042db39908ad2ca06261bf388cac6", size = 1003340, upload-time = "2023-08-25T13:18:56.521Z" }, + { url = "https://files.pythonhosted.org/packages/41/9b/5a42ddd23b85357be6764e14daa607d9b16bc6a395aae2c1cc2077e0a11d/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6720505f2d2a764c76bcc4f3730a9dff69d9871740e46264f6605d73f9ce3794", size = 969496, upload-time = "2023-08-25T13:18:59.048Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9f/4dfa29d74276fa07c40689bfaa3b21d057249314aeb20150f0f41373d16d/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e947e7251769593da93832a10861f59565a46149fa117ebdf25377e7b2853936", size = 939972, upload-time = "2023-08-25T13:19:00.704Z" }, + { url = "https://files.pythonhosted.org/packages/74/34/950b6d799839c11e93566aef426b67f0a446c4906e45e592026fde894459/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55a30b7cee0a53cddf9016b86fdad87221980d5a02a6126c491bd309755e6de9", size = 828557, upload-time = "2023-08-25T13:19:02.264Z" }, + { url = "https://files.pythonhosted.org/packages/81/a8/ee95263abc9806c81d77be8a3420d1f4dde467a10030dde8b0fa0e63f700/fast_query_parsers-1.0.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc2b457caa38371df1a30cfdfc57bd9bfdf348367abdaf6f36533416a0b0e93", size = 863119, upload-time = "2023-08-25T13:19:03.941Z" }, + { url = "https://files.pythonhosted.org/packages/05/d4/5eb8c9d400230b9a45a0ce47a443e9fe37b0902729f9440adef677af1f0d/fast_query_parsers-1.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5736d3c32d6ba23995fa569fe572feabcfcfc30ac9e4709e94cff6f2c456a3d1", size = 911046, upload-time = "2023-08-25T13:19:05.596Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b8/bf5e44588f6ebd81d0c53ba49c79999dc54cb0fe81ad6dde6fed2cd45b56/fast_query_parsers-1.0.3-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:3a6377eb0c5b172fbc77c3f96deaf1e51708b4b96d27ce173658bf11c1c00b20", size = 962966, upload-time = "2023-08-25T13:19:07.355Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a9/132572b9f40c2635fdedb7a1cb6cedd9c880f8ffbbfdd6215ee493bb6936/fast_query_parsers-1.0.3-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:7ca6be04f443a1b055e910ccad01b1d72212f269a530415df99a87c5f1e9c927", size = 965422, upload-time = "2023-08-25T13:19:09.003Z" }, + { url = "https://files.pythonhosted.org/packages/ea/58/942327d3f2694b8f1a2fffaaaef1cc3147571852473a80070ebd6156a62e/fast_query_parsers-1.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a70d4d8852606f2dd5b798ab628b9d8dc6970ddfdd9e96f4543eb0cc89a74fb5", size = 967734, upload-time = "2023-08-25T13:19:10.654Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e3/21bc18edc003b54a2069eb854b9f92cacb5acc99e03c609487a23a673755/fast_query_parsers-1.0.3-cp38-abi3-win32.whl", hash = "sha256:14b3fab7e9a6ac1c1efaf66c3fd2a3fd1e25ede03ed14118035e530433830a11", size = 646366, upload-time = "2023-08-25T13:19:12.079Z" }, + { url = "https://files.pythonhosted.org/packages/ae/4b/07fe4d7b5c458bdde9b0bfd8e8cb5762341af6c9727b43c2331c0cb0dbc3/fast_query_parsers-1.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:21ae5f3a209aee7d3b84bdcdb33dd79f39fc8cb608b3ae8cfcb78123758c1a16", size = 689717, upload-time = "2023-08-25T13:19:14.051Z" }, +] + +[[package]] +name = "filelock" +version = "3.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, +] + +[[package]] +name = "greenlet" +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/1c/53/f9c440463b3057485b8594d7a638bed53ba531165ef0ca0e6c364b5cc807/greenlet-3.2.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e343822feb58ac4d0a1211bd9399de2b3a04963ddeec21530fc426cc121f19b", size = 1564759, upload-time = "2025-11-04T12:42:19.395Z" }, + { url = "https://files.pythonhosted.org/packages/47/e4/3bb4240abdd0a8d23f4f88adec746a3099f0d86bfedb623f063b2e3b4df0/greenlet-3.2.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca7f6f1f2649b89ce02f6f229d7c19f680a6238af656f61e0115b24857917929", size = 1634288, upload-time = "2025-11-04T12:42:21.174Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, + { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, + { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, + { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, + { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, + { url = "https://files.pythonhosted.org/packages/0d/da/343cd760ab2f92bac1845ca07ee3faea9fe52bee65f7bcb19f16ad7de08b/greenlet-3.2.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:015d48959d4add5d6c9f6c5210ee3803a830dce46356e3bc326d6776bde54681", size = 1680760, upload-time = "2025-11-04T12:42:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a5/6ddab2b4c112be95601c13428db1d8b6608a8b6039816f2ba09c346c08fc/greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01", size = 303425, upload-time = "2025-08-07T13:32:27.59Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jsbeautifier" +version = "1.15.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "editorconfig" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/98/d6cadf4d5a1c03b2136837a435682418c29fdeb66be137128544cecc5b7a/jsbeautifier-1.15.4.tar.gz", hash = "sha256:5bb18d9efb9331d825735fbc5360ee8f1aac5e52780042803943aa7f854f7592", size = 75257, upload-time = "2025-02-27T17:53:53.252Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/14/1c65fccf8413d5f5c6e8425f84675169654395098000d8bddc4e9d3390e1/jsbeautifier-1.15.4-py3-none-any.whl", hash = "sha256:72f65de312a3f10900d7685557f84cb61a9733c50dcc27271a39f5b0051bf528", size = 94707, upload-time = "2025-02-27T17:53:46.152Z" }, +] + +[[package]] +name = "litestar" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "click" }, + { name = "httpx" }, + { name = "litestar-htmx" }, + { name = "msgspec" }, + { name = "multidict" }, + { name = "multipart" }, + { name = "polyfactory" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "rich-click" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/75/e0c286719860bc63459dd3364616bb436aecfbd8ab26f212a3a7957a551f/litestar-2.18.0.tar.gz", hash = "sha256:be8f91813854722b7a2f37cbb57d76977050a96b2427d3c4455d406f0f4fcd50", size = 372890, upload-time = "2025-10-05T16:24:00.094Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/ec/76d3e07db8bac2f3248acb8879c7a8ba6b6c96e846c40d8474d1a0f79160/litestar-2.18.0-py3-none-any.whl", hash = "sha256:459ec993bafe47245c981d802a0a0c73f47c98313b3c4e47923eebe978f0e511", size = 564603, upload-time = "2025-10-05T16:23:58.439Z" }, +] + +[package.optional-dependencies] +jwt = [ + { name = "cryptography" }, + { name = "pyjwt" }, +] +standard = [ + { name = "fast-query-parsers" }, + { name = "jinja2" }, + { name = "jsbeautifier" }, + { name = "uvicorn", extra = ["standard"] }, + { name = "uvloop", marker = "sys_platform != 'win32'" }, +] + +[[package]] +name = "litestar-htmx" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/b9/7e296aa1adada25cce8e5f89a996b0e38d852d93b1b656a2058226c542a2/litestar_htmx-0.5.0.tar.gz", hash = "sha256:e02d1a3a92172c874835fa3e6749d65ae9fc626d0df46719490a16293e2146fb", size = 119755, upload-time = "2025-06-11T21:19:45.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/24/8d99982f0aa9c1cd82073c6232b54a0dbe6797c7d63c0583a6c68ee3ddf2/litestar_htmx-0.5.0-py3-none-any.whl", hash = "sha256:92833aa47e0d0e868d2a7dbfab75261f124f4b83d4f9ad12b57b9a68f86c50e6", size = 9970, upload-time = "2025-06-11T21:19:44.465Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, +] + +[[package]] +name = "mako" +version = "1.3.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload-time = "2025-04-10T12:44:31.16Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "msgspec" +version = "0.19.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/9b/95d8ce458462b8b71b8a70fa94563b2498b89933689f3a7b8911edfae3d7/msgspec-0.19.0.tar.gz", hash = "sha256:604037e7cd475345848116e89c553aa9a233259733ab51986ac924ab1b976f8e", size = 216934, upload-time = "2024-12-27T17:40:28.597Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/cb/2842c312bbe618d8fefc8b9cedce37f773cdc8fa453306546dba2c21fd98/msgspec-0.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f12d30dd6266557aaaf0aa0f9580a9a8fbeadfa83699c487713e355ec5f0bd86", size = 190498, upload-time = "2024-12-27T17:40:00.427Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/c40b01b93465e1a5f3b6c7d91b10fb574818163740cc3acbe722d1e0e7e4/msgspec-0.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82b2c42c1b9ebc89e822e7e13bbe9d17ede0c23c187469fdd9505afd5a481314", size = 183950, upload-time = "2024-12-27T17:40:04.219Z" }, + { url = "https://files.pythonhosted.org/packages/e8/f0/5b764e066ce9aba4b70d1db8b087ea66098c7c27d59b9dd8a3532774d48f/msgspec-0.19.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19746b50be214a54239aab822964f2ac81e38b0055cca94808359d779338c10e", size = 210647, upload-time = "2024-12-27T17:40:05.606Z" }, + { url = "https://files.pythonhosted.org/packages/9d/87/bc14f49bc95c4cb0dd0a8c56028a67c014ee7e6818ccdce74a4862af259b/msgspec-0.19.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60ef4bdb0ec8e4ad62e5a1f95230c08efb1f64f32e6e8dd2ced685bcc73858b5", size = 213563, upload-time = "2024-12-27T17:40:10.516Z" }, + { url = "https://files.pythonhosted.org/packages/53/2f/2b1c2b056894fbaa975f68f81e3014bb447516a8b010f1bed3fb0e016ed7/msgspec-0.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac7f7c377c122b649f7545810c6cd1b47586e3aa3059126ce3516ac7ccc6a6a9", size = 213996, upload-time = "2024-12-27T17:40:12.244Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5a/4cd408d90d1417e8d2ce6a22b98a6853c1b4d7cb7669153e4424d60087f6/msgspec-0.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a5bc1472223a643f5ffb5bf46ccdede7f9795078194f14edd69e3aab7020d327", size = 219087, upload-time = "2024-12-27T17:40:14.881Z" }, + { url = "https://files.pythonhosted.org/packages/23/d8/f15b40611c2d5753d1abb0ca0da0c75348daf1252220e5dda2867bd81062/msgspec-0.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:317050bc0f7739cb30d257ff09152ca309bf5a369854bbf1e57dffc310c1f20f", size = 187432, upload-time = "2024-12-27T17:40:16.256Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/86/33272a544eeb36d66e4d9a920602d1a2f57d4ebea4ef3cdfe5a912574c95/multidict-6.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bee7c0588aa0076ce77c0ea5d19a68d76ad81fcd9fe8501003b9a24f9d4000f6", size = 76135, upload-time = "2025-10-06T14:49:54.26Z" }, + { url = "https://files.pythonhosted.org/packages/91/1c/eb97db117a1ebe46d457a3d235a7b9d2e6dcab174f42d1b67663dd9e5371/multidict-6.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7ef6b61cad77091056ce0e7ce69814ef72afacb150b7ac6a3e9470def2198159", size = 45117, upload-time = "2025-10-06T14:49:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/6c3442322e41fb1dd4de8bd67bfd11cd72352ac131f6368315617de752f1/multidict-6.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c0359b1ec12b1d6849c59f9d319610b7f20ef990a6d454ab151aa0e3b9f78ca", size = 43472, upload-time = "2025-10-06T14:49:57.048Z" }, + { url = "https://files.pythonhosted.org/packages/75/3f/e2639e80325af0b6c6febdf8e57cc07043ff15f57fa1ef808f4ccb5ac4cd/multidict-6.7.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cd240939f71c64bd658f186330603aac1a9a81bf6273f523fca63673cb7378a8", size = 249342, upload-time = "2025-10-06T14:49:58.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/cc/84e0585f805cbeaa9cbdaa95f9a3d6aed745b9d25700623ac89a6ecff400/multidict-6.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60a4d75718a5efa473ebd5ab685786ba0c67b8381f781d1be14da49f1a2dc60", size = 257082, upload-time = "2025-10-06T14:49:59.89Z" }, + { url = "https://files.pythonhosted.org/packages/b0/9c/ac851c107c92289acbbf5cfb485694084690c1b17e555f44952c26ddc5bd/multidict-6.7.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53a42d364f323275126aff81fb67c5ca1b7a04fda0546245730a55c8c5f24bc4", size = 240704, upload-time = "2025-10-06T14:50:01.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/cc/5f93e99427248c09da95b62d64b25748a5f5c98c7c2ab09825a1d6af0e15/multidict-6.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3b29b980d0ddbecb736735ee5bef69bb2ddca56eff603c86f3f29a1128299b4f", size = 266355, upload-time = "2025-10-06T14:50:02.955Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0c/2ec1d883ceb79c6f7f6d7ad90c919c898f5d1c6ea96d322751420211e072/multidict-6.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f8a93b1c0ed2d04b97a5e9336fd2d33371b9a6e29ab7dd6503d63407c20ffbaf", size = 267259, upload-time = "2025-10-06T14:50:04.446Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2d/f0b184fa88d6630aa267680bdb8623fb69cb0d024b8c6f0d23f9a0f406d3/multidict-6.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ff96e8815eecacc6645da76c413eb3b3d34cfca256c70b16b286a687d013c32", size = 254903, upload-time = "2025-10-06T14:50:05.98Z" }, + { url = "https://files.pythonhosted.org/packages/06/c9/11ea263ad0df7dfabcad404feb3c0dd40b131bc7f232d5537f2fb1356951/multidict-6.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7516c579652f6a6be0e266aec0acd0db80829ca305c3d771ed898538804c2036", size = 252365, upload-time = "2025-10-06T14:50:07.511Z" }, + { url = "https://files.pythonhosted.org/packages/41/88/d714b86ee2c17d6e09850c70c9d310abac3d808ab49dfa16b43aba9d53fd/multidict-6.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:040f393368e63fb0f3330e70c26bfd336656bed925e5cbe17c9da839a6ab13ec", size = 250062, upload-time = "2025-10-06T14:50:09.074Z" }, + { url = "https://files.pythonhosted.org/packages/15/fe/ad407bb9e818c2b31383f6131ca19ea7e35ce93cf1310fce69f12e89de75/multidict-6.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b3bc26a951007b1057a1c543af845f1c7e3e71cc240ed1ace7bf4484aa99196e", size = 249683, upload-time = "2025-10-06T14:50:10.714Z" }, + { url = "https://files.pythonhosted.org/packages/8c/a4/a89abdb0229e533fb925e7c6e5c40201c2873efebc9abaf14046a4536ee6/multidict-6.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7b022717c748dd1992a83e219587aabe45980d88969f01b316e78683e6285f64", size = 261254, upload-time = "2025-10-06T14:50:12.28Z" }, + { url = "https://files.pythonhosted.org/packages/8d/aa/0e2b27bd88b40a4fb8dc53dd74eecac70edaa4c1dd0707eb2164da3675b3/multidict-6.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9600082733859f00d79dee64effc7aef1beb26adb297416a4ad2116fd61374bd", size = 257967, upload-time = "2025-10-06T14:50:14.16Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/0c67b7120d5d5f6d874ed85a085f9dc770a7f9d8813e80f44a9fec820bb7/multidict-6.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:94218fcec4d72bc61df51c198d098ce2b378e0ccbac41ddbed5ef44092913288", size = 250085, upload-time = "2025-10-06T14:50:15.639Z" }, + { url = "https://files.pythonhosted.org/packages/ba/55/b73e1d624ea4b8fd4dd07a3bb70f6e4c7c6c5d9d640a41c6ffe5cdbd2a55/multidict-6.7.0-cp313-cp313-win32.whl", hash = "sha256:a37bd74c3fa9d00be2d7b8eca074dc56bd8077ddd2917a839bd989612671ed17", size = 41713, upload-time = "2025-10-06T14:50:17.066Z" }, + { url = "https://files.pythonhosted.org/packages/32/31/75c59e7d3b4205075b4c183fa4ca398a2daf2303ddf616b04ae6ef55cffe/multidict-6.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:30d193c6cc6d559db42b6bcec8a5d395d34d60c9877a0b71ecd7c204fcf15390", size = 45915, upload-time = "2025-10-06T14:50:18.264Z" }, + { url = "https://files.pythonhosted.org/packages/31/2a/8987831e811f1184c22bc2e45844934385363ee61c0a2dcfa8f71b87e608/multidict-6.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:ea3334cabe4d41b7ccd01e4d349828678794edbc2d3ae97fc162a3312095092e", size = 43077, upload-time = "2025-10-06T14:50:19.853Z" }, + { url = "https://files.pythonhosted.org/packages/e8/68/7b3a5170a382a340147337b300b9eb25a9ddb573bcdfff19c0fa3f31ffba/multidict-6.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ad9ce259f50abd98a1ca0aa6e490b58c316a0fce0617f609723e40804add2c00", size = 83114, upload-time = "2025-10-06T14:50:21.223Z" }, + { url = "https://files.pythonhosted.org/packages/55/5c/3fa2d07c84df4e302060f555bbf539310980362236ad49f50eeb0a1c1eb9/multidict-6.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07f5594ac6d084cbb5de2df218d78baf55ef150b91f0ff8a21cc7a2e3a5a58eb", size = 48442, upload-time = "2025-10-06T14:50:22.871Z" }, + { url = "https://files.pythonhosted.org/packages/fc/56/67212d33239797f9bd91962bb899d72bb0f4c35a8652dcdb8ed049bef878/multidict-6.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0591b48acf279821a579282444814a2d8d0af624ae0bc600aa4d1b920b6e924b", size = 46885, upload-time = "2025-10-06T14:50:24.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/d1/908f896224290350721597a61a69cd19b89ad8ee0ae1f38b3f5cd12ea2ac/multidict-6.7.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:749a72584761531d2b9467cfbdfd29487ee21124c304c4b6cb760d8777b27f9c", size = 242588, upload-time = "2025-10-06T14:50:25.716Z" }, + { url = "https://files.pythonhosted.org/packages/ab/67/8604288bbd68680eee0ab568fdcb56171d8b23a01bcd5cb0c8fedf6e5d99/multidict-6.7.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b4c3d199f953acd5b446bf7c0de1fe25d94e09e79086f8dc2f48a11a129cdf1", size = 249966, upload-time = "2025-10-06T14:50:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/20/33/9228d76339f1ba51e3efef7da3ebd91964d3006217aae13211653193c3ff/multidict-6.7.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9fb0211dfc3b51efea2f349ec92c114d7754dd62c01f81c3e32b765b70c45c9b", size = 228618, upload-time = "2025-10-06T14:50:29.82Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2d/25d9b566d10cab1c42b3b9e5b11ef79c9111eaf4463b8c257a3bd89e0ead/multidict-6.7.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a027ec240fe73a8d6281872690b988eed307cd7d91b23998ff35ff577ca688b5", size = 257539, upload-time = "2025-10-06T14:50:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b1/8d1a965e6637fc33de3c0d8f414485c2b7e4af00f42cab3d84e7b955c222/multidict-6.7.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1d964afecdf3a8288789df2f5751dc0a8261138c3768d9af117ed384e538fad", size = 256345, upload-time = "2025-10-06T14:50:33.26Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/06b5a8adbdeedada6f4fb8d8f193d44a347223b11939b42953eeb6530b6b/multidict-6.7.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:caf53b15b1b7df9fbd0709aa01409000a2b4dd03a5f6f5cc548183c7c8f8b63c", size = 247934, upload-time = "2025-10-06T14:50:34.808Z" }, + { url = "https://files.pythonhosted.org/packages/8f/31/b2491b5fe167ca044c6eb4b8f2c9f3b8a00b24c432c365358eadac5d7625/multidict-6.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:654030da3197d927f05a536a66186070e98765aa5142794c9904555d3a9d8fb5", size = 245243, upload-time = "2025-10-06T14:50:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/61/1a/982913957cb90406c8c94f53001abd9eafc271cb3e70ff6371590bec478e/multidict-6.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:2090d3718829d1e484706a2f525e50c892237b2bf9b17a79b059cb98cddc2f10", size = 235878, upload-time = "2025-10-06T14:50:37.953Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/21435d804c1a1cf7a2608593f4d19bca5bcbd7a81a70b253fdd1c12af9c0/multidict-6.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d2cfeec3f6f45651b3d408c4acec0ebf3daa9bc8a112a084206f5db5d05b754", size = 243452, upload-time = "2025-10-06T14:50:39.574Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/4349d540d4a883863191be6eb9a928846d4ec0ea007d3dcd36323bb058ac/multidict-6.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:4ef089f985b8c194d341eb2c24ae6e7408c9a0e2e5658699c92f497437d88c3c", size = 252312, upload-time = "2025-10-06T14:50:41.612Z" }, + { url = "https://files.pythonhosted.org/packages/26/64/d5416038dbda1488daf16b676e4dbfd9674dde10a0cc8f4fc2b502d8125d/multidict-6.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e93a0617cd16998784bf4414c7e40f17a35d2350e5c6f0bd900d3a8e02bd3762", size = 246935, upload-time = "2025-10-06T14:50:43.972Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8c/8290c50d14e49f35e0bd4abc25e1bc7711149ca9588ab7d04f886cdf03d9/multidict-6.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0feece2ef8ebc42ed9e2e8c78fc4aa3cf455733b507c09ef7406364c94376c6", size = 243385, upload-time = "2025-10-06T14:50:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a0/f83ae75e42d694b3fbad3e047670e511c138be747bc713cf1b10d5096416/multidict-6.7.0-cp313-cp313t-win32.whl", hash = "sha256:19a1d55338ec1be74ef62440ca9e04a2f001a04d0cc49a4983dc320ff0f3212d", size = 47777, upload-time = "2025-10-06T14:50:47.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/80/9b174a92814a3830b7357307a792300f42c9e94664b01dee8e457551fa66/multidict-6.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3da4fb467498df97e986af166b12d01f05d2e04f978a9c1c680ea1988e0bc4b6", size = 53104, upload-time = "2025-10-06T14:50:48.851Z" }, + { url = "https://files.pythonhosted.org/packages/cc/28/04baeaf0428d95bb7a7bea0e691ba2f31394338ba424fb0679a9ed0f4c09/multidict-6.7.0-cp313-cp313t-win_arm64.whl", hash = "sha256:b4121773c49a0776461f4a904cdf6264c88e42218aaa8407e803ca8025872792", size = 45503, upload-time = "2025-10-06T14:50:50.16Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b1/3da6934455dd4b261d4c72f897e3a5728eba81db59959f3a639245891baa/multidict-6.7.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3bab1e4aff7adaa34410f93b1f8e57c4b36b9af0426a76003f441ee1d3c7e842", size = 75128, upload-time = "2025-10-06T14:50:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b8512bac933afc3e45fb2b18da8e59b78d4f408399a960339598374d4ae3b56b", size = 44410, upload-time = "2025-10-06T14:50:53.275Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:79dcf9e477bc65414ebfea98ffd013cb39552b5ecd62908752e0e413d6d06e38", size = 43205, upload-time = "2025-10-06T14:50:54.911Z" }, + { url = "https://files.pythonhosted.org/packages/02/68/6b086fef8a3f1a8541b9236c594f0c9245617c29841f2e0395d979485cde/multidict-6.7.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:31bae522710064b5cbeddaf2e9f32b1abab70ac6ac91d42572502299e9953128", size = 245084, upload-time = "2025-10-06T14:50:56.369Z" }, + { url = "https://files.pythonhosted.org/packages/15/ee/f524093232007cd7a75c1d132df70f235cfd590a7c9eaccd7ff422ef4ae8/multidict-6.7.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a0df7ff02397bb63e2fd22af2c87dfa39e8c7f12947bc524dbdc528282c7e34", size = 252667, upload-time = "2025-10-06T14:50:57.991Z" }, + { url = "https://files.pythonhosted.org/packages/02/a5/eeb3f43ab45878f1895118c3ef157a480db58ede3f248e29b5354139c2c9/multidict-6.7.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a0222514e8e4c514660e182d5156a415c13ef0aabbd71682fc714e327b95e99", size = 233590, upload-time = "2025-10-06T14:50:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1e/76d02f8270b97269d7e3dbd45644b1785bda457b474315f8cf999525a193/multidict-6.7.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2397ab4daaf2698eb51a76721e98db21ce4f52339e535725de03ea962b5a3202", size = 264112, upload-time = "2025-10-06T14:51:01.183Z" }, + { url = "https://files.pythonhosted.org/packages/76/0b/c28a70ecb58963847c2a8efe334904cd254812b10e535aefb3bcce513918/multidict-6.7.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8891681594162635948a636c9fe0ff21746aeb3dd5463f6e25d9bea3a8a39ca1", size = 261194, upload-time = "2025-10-06T14:51:02.794Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18706cc31dbf402a7945916dd5cddf160251b6dab8a2c5f3d6d5a55949f676b3", size = 248510, upload-time = "2025-10-06T14:51:04.724Z" }, + { url = "https://files.pythonhosted.org/packages/93/cd/06c1fa8282af1d1c46fd55c10a7930af652afdce43999501d4d68664170c/multidict-6.7.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f844a1bbf1d207dd311a56f383f7eda2d0e134921d45751842d8235e7778965d", size = 248395, upload-time = "2025-10-06T14:51:06.306Z" }, + { url = "https://files.pythonhosted.org/packages/99/ac/82cb419dd6b04ccf9e7e61befc00c77614fc8134362488b553402ecd55ce/multidict-6.7.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4393e3581e84e5645506923816b9cc81f5609a778c7e7534054091acc64d1c6", size = 239520, upload-time = "2025-10-06T14:51:08.091Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f3/a0f9bf09493421bd8716a362e0cd1d244f5a6550f5beffdd6b47e885b331/multidict-6.7.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:fbd18dc82d7bf274b37aa48d664534330af744e03bccf696d6f4c6042e7d19e7", size = 245479, upload-time = "2025-10-06T14:51:10.365Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/476d38fc73a212843f43c852b0eee266b6971f0e28329c2184a8df90c376/multidict-6.7.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b6234e14f9314731ec45c42fc4554b88133ad53a09092cc48a88e771c125dadb", size = 258903, upload-time = "2025-10-06T14:51:12.466Z" }, + { url = "https://files.pythonhosted.org/packages/49/6d/23faeb0868adba613b817d0e69c5f15531b24d462af8012c4f6de4fa8dc3/multidict-6.7.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:08d4379f9744d8f78d98c8673c06e202ffa88296f009c71bbafe8a6bf847d01f", size = 252333, upload-time = "2025-10-06T14:51:14.48Z" }, + { url = "https://files.pythonhosted.org/packages/1e/cc/48d02ac22b30fa247f7dad82866e4b1015431092f4ba6ebc7e77596e0b18/multidict-6.7.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9fe04da3f79387f450fd0061d4dd2e45a72749d31bf634aecc9e27f24fdc4b3f", size = 243411, upload-time = "2025-10-06T14:51:16.072Z" }, + { url = "https://files.pythonhosted.org/packages/4a/03/29a8bf5a18abf1fe34535c88adbdfa88c9fb869b5a3b120692c64abe8284/multidict-6.7.0-cp314-cp314-win32.whl", hash = "sha256:fbafe31d191dfa7c4c51f7a6149c9fb7e914dcf9ffead27dcfd9f1ae382b3885", size = 40940, upload-time = "2025-10-06T14:51:17.544Z" }, + { url = "https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl", hash = "sha256:2f67396ec0310764b9222a1728ced1ab638f61aadc6226f17a71dd9324f9a99c", size = 45087, upload-time = "2025-10-06T14:51:18.875Z" }, + { url = "https://files.pythonhosted.org/packages/cd/3c/e3e62eb35a1950292fe39315d3c89941e30a9d07d5d2df42965ab041da43/multidict-6.7.0-cp314-cp314-win_arm64.whl", hash = "sha256:ba672b26069957ee369cfa7fc180dde1fc6f176eaf1e6beaf61fbebbd3d9c000", size = 42368, upload-time = "2025-10-06T14:51:20.225Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/cd499bd0dbc5f1136726db3153042a735fffd0d77268e2ee20d5f33c010f/multidict-6.7.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:c1dcc7524066fa918c6a27d61444d4ee7900ec635779058571f70d042d86ed63", size = 82326, upload-time = "2025-10-06T14:51:21.588Z" }, + { url = "https://files.pythonhosted.org/packages/13/8a/18e031eca251c8df76daf0288e6790561806e439f5ce99a170b4af30676b/multidict-6.7.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:27e0b36c2d388dc7b6ced3406671b401e84ad7eb0656b8f3a2f46ed0ce483718", size = 48065, upload-time = "2025-10-06T14:51:22.93Z" }, + { url = "https://files.pythonhosted.org/packages/40/71/5e6701277470a87d234e433fb0a3a7deaf3bcd92566e421e7ae9776319de/multidict-6.7.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a7baa46a22e77f0988e3b23d4ede5513ebec1929e34ee9495be535662c0dfe2", size = 46475, upload-time = "2025-10-06T14:51:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/fe/6a/bab00cbab6d9cfb57afe1663318f72ec28289ea03fd4e8236bb78429893a/multidict-6.7.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7bf77f54997a9166a2f5675d1201520586439424c2511723a7312bdb4bcc034e", size = 239324, upload-time = "2025-10-06T14:51:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5f/8de95f629fc22a7769ade8b41028e3e5a822c1f8904f618d175945a81ad3/multidict-6.7.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e011555abada53f1578d63389610ac8a5400fc70ce71156b0aa30d326f1a5064", size = 246877, upload-time = "2025-10-06T14:51:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/23/b4/38881a960458f25b89e9f4a4fdcb02ac101cfa710190db6e5528841e67de/multidict-6.7.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:28b37063541b897fd6a318007373930a75ca6d6ac7c940dbe14731ffdd8d498e", size = 225824, upload-time = "2025-10-06T14:51:29.664Z" }, + { url = "https://files.pythonhosted.org/packages/1e/39/6566210c83f8a261575f18e7144736059f0c460b362e96e9cf797a24b8e7/multidict-6.7.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05047ada7a2fde2631a0ed706f1fd68b169a681dfe5e4cf0f8e4cb6618bbc2cd", size = 253558, upload-time = "2025-10-06T14:51:31.684Z" }, + { url = "https://files.pythonhosted.org/packages/00/a3/67f18315100f64c269f46e6c0319fa87ba68f0f64f2b8e7fd7c72b913a0b/multidict-6.7.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:716133f7d1d946a4e1b91b1756b23c088881e70ff180c24e864c26192ad7534a", size = 252339, upload-time = "2025-10-06T14:51:33.699Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2a/1cb77266afee2458d82f50da41beba02159b1d6b1f7973afc9a1cad1499b/multidict-6.7.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1bed1b467ef657f2a0ae62844a607909ef1c6889562de5e1d505f74457d0b96", size = 244895, upload-time = "2025-10-06T14:51:36.189Z" }, + { url = "https://files.pythonhosted.org/packages/dd/72/09fa7dd487f119b2eb9524946ddd36e2067c08510576d43ff68469563b3b/multidict-6.7.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ca43bdfa5d37bd6aee89d85e1d0831fb86e25541be7e9d376ead1b28974f8e5e", size = 241862, upload-time = "2025-10-06T14:51:41.291Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/bc1f8bd0853d8669300f732c801974dfc3702c3eeadae2f60cef54dc69d7/multidict-6.7.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:44b546bd3eb645fd26fb949e43c02a25a2e632e2ca21a35e2e132c8105dc8599", size = 232376, upload-time = "2025-10-06T14:51:43.55Z" }, + { url = "https://files.pythonhosted.org/packages/09/86/ac39399e5cb9d0c2ac8ef6e10a768e4d3bc933ac808d49c41f9dc23337eb/multidict-6.7.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a6ef16328011d3f468e7ebc326f24c1445f001ca1dec335b2f8e66bed3006394", size = 240272, upload-time = "2025-10-06T14:51:45.265Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/fed5ac6b8563ec72df6cb1ea8dac6d17f0a4a1f65045f66b6d3bf1497c02/multidict-6.7.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:5aa873cbc8e593d361ae65c68f85faadd755c3295ea2c12040ee146802f23b38", size = 248774, upload-time = "2025-10-06T14:51:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/6b/8d/b954d8c0dc132b68f760aefd45870978deec6818897389dace00fcde32ff/multidict-6.7.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:3d7b6ccce016e29df4b7ca819659f516f0bc7a4b3efa3bb2012ba06431b044f9", size = 242731, upload-time = "2025-10-06T14:51:48.541Z" }, + { url = "https://files.pythonhosted.org/packages/16/9d/a2dac7009125d3540c2f54e194829ea18ac53716c61b655d8ed300120b0f/multidict-6.7.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:171b73bd4ee683d307599b66793ac80981b06f069b62eea1c9e29c9241aa66b0", size = 240193, upload-time = "2025-10-06T14:51:50.355Z" }, + { url = "https://files.pythonhosted.org/packages/39/ca/c05f144128ea232ae2178b008d5011d4e2cea86e4ee8c85c2631b1b94802/multidict-6.7.0-cp314-cp314t-win32.whl", hash = "sha256:b2d7f80c4e1fd010b07cb26820aae86b7e73b681ee4889684fb8d2d4537aab13", size = 48023, upload-time = "2025-10-06T14:51:51.883Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8f/0a60e501584145588be1af5cc829265701ba3c35a64aec8e07cbb71d39bb/multidict-6.7.0-cp314-cp314t-win_amd64.whl", hash = "sha256:09929cab6fcb68122776d575e03c6cc64ee0b8fca48d17e135474b042ce515cd", size = 53507, upload-time = "2025-10-06T14:51:53.672Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/3148b988a9c6239903e786eac19c889fab607c31d6efa7fb2147e5680f23/multidict-6.7.0-cp314-cp314t-win_arm64.whl", hash = "sha256:cc41db090ed742f32bd2d2c721861725e6109681eddf835d0a82bd3a5c382827", size = 44804, upload-time = "2025-10-06T14:51:55.415Z" }, + { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +] + +[[package]] +name = "multipart" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/c9/c6f5ab81bae667d4fe42a58df29f4c2db6ad8377cfd0e9baa729e4fa3ebb/multipart-1.3.0.tar.gz", hash = "sha256:a46bd6b0eb4c1ba865beb88ddd886012a3da709b6e7b86084fc37e99087e5cf1", size = 38816, upload-time = "2025-07-26T15:09:38.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/d6/d547a7004b81fa0b2aafa143b09196f6635e4105cd9d2c641fa8a4051c05/multipart-1.3.0-py3-none-any.whl", hash = "sha256:439bf4b00fd7cb2dbff08ae13f49f4f49798931ecd8d496372c63537fa19f304", size = 14938, upload-time = "2025-07-26T15:09:36.884Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "passlib" +version = "1.7.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/06/9da9ee59a67fae7761aab3ccc84fa4f3f33f125b370f1ccdb915bf967c11/passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04", size = 689844, upload-time = "2020-10-08T19:00:52.121Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/a4/ab6b7589382ca3df236e03faa71deac88cae040af60c071a78d254a62172/passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1", size = 525554, upload-time = "2020-10-08T19:00:49.856Z" }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828, upload-time = "2025-10-15T18:24:14.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493, upload-time = "2025-10-15T18:22:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461, upload-time = "2025-10-15T18:22:27.286Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912, upload-time = "2025-10-15T18:22:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132, upload-time = "2025-10-15T18:22:30.641Z" }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099, upload-time = "2025-10-15T18:22:32.73Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808, upload-time = "2025-10-15T18:22:34.337Z" }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804, upload-time = "2025-10-15T18:22:36.402Z" }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553, upload-time = "2025-10-15T18:22:38.066Z" }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729, upload-time = "2025-10-15T18:22:39.769Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789, upload-time = "2025-10-15T18:22:41.437Z" }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917, upload-time = "2025-10-15T18:22:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391, upload-time = "2025-10-15T18:22:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477, upload-time = "2025-10-15T18:22:46.838Z" }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918, upload-time = "2025-10-15T18:22:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406, upload-time = "2025-10-15T18:22:49.905Z" }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218, upload-time = "2025-10-15T18:22:51.587Z" }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564, upload-time = "2025-10-15T18:22:53.215Z" }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260, upload-time = "2025-10-15T18:22:54.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248, upload-time = "2025-10-15T18:22:56.605Z" }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043, upload-time = "2025-10-15T18:22:58.53Z" }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915, upload-time = "2025-10-15T18:23:00.582Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998, upload-time = "2025-10-15T18:23:02.627Z" }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201, upload-time = "2025-10-15T18:23:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165, upload-time = "2025-10-15T18:23:06.46Z" }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834, upload-time = "2025-10-15T18:23:08.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531, upload-time = "2025-10-15T18:23:10.121Z" }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554, upload-time = "2025-10-15T18:23:12.14Z" }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812, upload-time = "2025-10-15T18:23:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689, upload-time = "2025-10-15T18:23:15.562Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186, upload-time = "2025-10-15T18:23:17.379Z" }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308, upload-time = "2025-10-15T18:23:18.971Z" }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222, upload-time = "2025-10-15T18:23:20.909Z" }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657, upload-time = "2025-10-15T18:23:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482, upload-time = "2025-10-15T18:23:25.005Z" }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416, upload-time = "2025-10-15T18:23:27.009Z" }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584, upload-time = "2025-10-15T18:23:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621, upload-time = "2025-10-15T18:23:32.06Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916, upload-time = "2025-10-15T18:23:34.71Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836, upload-time = "2025-10-15T18:23:36.967Z" }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092, upload-time = "2025-10-15T18:23:38.573Z" }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158, upload-time = "2025-10-15T18:23:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882, upload-time = "2025-10-15T18:23:42.434Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001, upload-time = "2025-10-15T18:23:44.29Z" }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146, upload-time = "2025-10-15T18:23:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344, upload-time = "2025-10-15T18:23:47.898Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864, upload-time = "2025-10-15T18:23:49.607Z" }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911, upload-time = "2025-10-15T18:23:51.351Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045, upload-time = "2025-10-15T18:23:53.177Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282, upload-time = "2025-10-15T18:23:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630, upload-time = "2025-10-15T18:23:57.149Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "polyfactory" +version = "2.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "faker" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4e/a6/950d13856d995705df33b92451559fd317207a9c43629ab1771135a0c966/polyfactory-2.22.2.tar.gz", hash = "sha256:a3297aa0b004f2b26341e903795565ae88507c4d86e68b132c2622969028587a", size = 254462, upload-time = "2025-08-15T06:23:21.28Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/fe/d52c90e07c458f38b26f9972a25cb011b2744813f76fcd6121dde64744fa/polyfactory-2.22.2-py3-none-any.whl", hash = "sha256:9bea58ac9a80375b4153cd60820f75e558b863e567e058794d28c6a52b84118a", size = 63715, upload-time = "2025-08-15T06:23:19.664Z" }, +] + +[[package]] +name = "psycopg" +version = "3.2.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/02/9fdfc018c026df2bcf9c11480c1014f9b90c6d801e5f929408cbfbf94cc0/psycopg-3.2.11.tar.gz", hash = "sha256:398bb484ed44361e041c8f804ed7af3d2fcefbffdace1d905b7446c319321706", size = 160644, upload-time = "2025-10-18T22:48:28.136Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/1b/96ee90ed0007d64936d9bd1bb3108d0af3cf762b4f11dbd73359f0687c3d/psycopg-3.2.11-py3-none-any.whl", hash = "sha256:217231b2b6b72fba88281b94241b2f16043ee67f81def47c52a01b72ff0c086a", size = 206766, upload-time = "2025-10-18T22:43:32.114Z" }, +] + +[[package]] +name = "pwdlib" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/a0/9daed437a6226f632a25d98d65d60ba02bdafa920c90dcb6454c611ead6c/pwdlib-0.2.1.tar.gz", hash = "sha256:9a1d8a8fa09a2f7ebf208265e55d7d008103cbdc82b9e4902ffdd1ade91add5e", size = 11699, upload-time = "2024-08-19T06:48:59.58Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/f3/0dae5078a486f0fdf4d4a1121e103bc42694a9da9bea7b0f2c63f29cfbd3/pwdlib-0.2.1-py3-none-any.whl", hash = "sha256:1823dc6f22eae472b540e889ecf57fd424051d6a4023ec0bcf7f0de2d9d7ef8c", size = 8082, upload-time = "2024-08-19T06:49:00.997Z" }, +] + +[package.optional-dependencies] +argon2 = [ + { name = "argon2-cffi" }, +] + +[[package]] +name = "pycparser" +version = "2.23" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, +] + +[[package]] +name = "pydantic" +version = "2.12.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/35/d319ed522433215526689bad428a94058b6dd12190ce7ddd78618ac14b28/pydantic-2.12.2.tar.gz", hash = "sha256:7b8fa15b831a4bbde9d5b84028641ac3080a4ca2cbd4a621a661687e741624fd", size = 816358, upload-time = "2025-10-14T15:02:21.842Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/98/468cb649f208a6f1279448e6e5247b37ae79cf5e4041186f1e2ef3d16345/pydantic-2.12.2-py3-none-any.whl", hash = "sha256:25ff718ee909acd82f1ff9b1a4acfd781bb23ab3739adaa7144f19a6a4e231ae", size = 460628, upload-time = "2025-10-14T15:02:19.623Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.41.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" }, + { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" }, + { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" }, + { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" }, + { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" }, + { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" }, + { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" }, + { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" }, + { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" }, + { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" }, + { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" }, + { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" }, + { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" }, + { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" }, + { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" }, + { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" }, + { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" }, + { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" }, + { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" }, + { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" }, + { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" }, + { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" }, + { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" }, + { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" }, + { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" }, + { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" }, + { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/c5/dbbc27b814c71676593d1c3f718e6cd7d4f00652cefa24b75f7aa3efb25e/pydantic_settings-2.11.0.tar.gz", hash = "sha256:d0e87a1c7d33593beb7194adb8470fc426e95ba02af83a0f23474a04c9a08180", size = 188394, upload-time = "2025-09-24T14:19:11.764Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/d6/887a1ff844e64aa823fb4905978d882a633cfe295c32eacad582b78a7d8b/pydantic_settings-2.11.0-py3-none-any.whl", hash = "sha256:fe2cea3413b9530d10f3a5875adffb17ada5c1e1bab0b2885546d7310415207c", size = 48608, upload-time = "2025-09-24T14:19:10.015Z" }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, +] + +[[package]] +name = "pypdfium2" +version = "4.30.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/14/838b3ba247a0ba92e4df5d23f2bea9478edcfd72b78a39d6ca36ccd84ad2/pypdfium2-4.30.0.tar.gz", hash = "sha256:48b5b7e5566665bc1015b9d69c1ebabe21f6aee468b509531c3c8318eeee2e16", size = 140239, upload-time = "2024-05-09T18:33:17.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/9a/c8ff5cc352c1b60b0b97642ae734f51edbab6e28b45b4fcdfe5306ee3c83/pypdfium2-4.30.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab", size = 2837254, upload-time = "2024-05-09T18:32:48.653Z" }, + { url = "https://files.pythonhosted.org/packages/21/8b/27d4d5409f3c76b985f4ee4afe147b606594411e15ac4dc1c3363c9a9810/pypdfium2-4.30.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4e55689f4b06e2d2406203e771f78789bd4f190731b5d57383d05cf611d829de", size = 2707624, upload-time = "2024-05-09T18:32:51.458Z" }, + { url = "https://files.pythonhosted.org/packages/11/63/28a73ca17c24b41a205d658e177d68e198d7dde65a8c99c821d231b6ee3d/pypdfium2-4.30.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e6e50f5ce7f65a40a33d7c9edc39f23140c57e37144c2d6d9e9262a2a854854", size = 2793126, upload-time = "2024-05-09T18:32:53.581Z" }, + { url = "https://files.pythonhosted.org/packages/d1/96/53b3ebf0955edbd02ac6da16a818ecc65c939e98fdeb4e0958362bd385c8/pypdfium2-4.30.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3d0dd3ecaffd0b6dbda3da663220e705cb563918249bda26058c6036752ba3a2", size = 2591077, upload-time = "2024-05-09T18:32:55.99Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ee/0394e56e7cab8b5b21f744d988400948ef71a9a892cbeb0b200d324ab2c7/pypdfium2-4.30.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc3bf29b0db8c76cdfaac1ec1cde8edf211a7de7390fbf8934ad2aa9b4d6dfad", size = 2864431, upload-time = "2024-05-09T18:32:57.911Z" }, + { url = "https://files.pythonhosted.org/packages/65/cd/3f1edf20a0ef4a212a5e20a5900e64942c5a374473671ac0780eaa08ea80/pypdfium2-4.30.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1f78d2189e0ddf9ac2b7a9b9bd4f0c66f54d1389ff6c17e9fd9dc034d06eb3f", size = 2812008, upload-time = "2024-05-09T18:32:59.886Z" }, + { url = "https://files.pythonhosted.org/packages/c8/91/2d517db61845698f41a2a974de90762e50faeb529201c6b3574935969045/pypdfium2-4.30.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:5eda3641a2da7a7a0b2f4dbd71d706401a656fea521b6b6faa0675b15d31a163", size = 6181543, upload-time = "2024-05-09T18:33:02.597Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c4/ed1315143a7a84b2c7616569dfb472473968d628f17c231c39e29ae9d780/pypdfium2-4.30.0-py3-none-musllinux_1_1_i686.whl", hash = "sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e", size = 6175911, upload-time = "2024-05-09T18:33:05.376Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c4/9e62d03f414e0e3051c56d5943c3bf42aa9608ede4e19dc96438364e9e03/pypdfium2-4.30.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:f33bd79e7a09d5f7acca3b0b69ff6c8a488869a7fab48fdf400fec6e20b9c8be", size = 6267430, upload-time = "2024-05-09T18:33:08.067Z" }, + { url = "https://files.pythonhosted.org/packages/90/47/eda4904f715fb98561e34012826e883816945934a851745570521ec89520/pypdfium2-4.30.0-py3-none-win32.whl", hash = "sha256:ee2410f15d576d976c2ab2558c93d392a25fb9f6635e8dd0a8a3a5241b275e0e", size = 2775951, upload-time = "2024-05-09T18:33:10.567Z" }, + { url = "https://files.pythonhosted.org/packages/25/bd/56d9ec6b9f0fc4e0d95288759f3179f0fcd34b1a1526b75673d2f6d5196f/pypdfium2-4.30.0-py3-none-win_amd64.whl", hash = "sha256:90dbb2ac07be53219f56be09961eb95cf2473f834d01a42d901d13ccfad64b4c", size = 2892098, upload-time = "2024-05-09T18:33:13.107Z" }, + { url = "https://files.pythonhosted.org/packages/be/7a/097801205b991bc3115e8af1edb850d30aeaf0118520b016354cf5ccd3f6/pypdfium2-4.30.0-py3-none-win_arm64.whl", hash = "sha256:119b2969a6d6b1e8d55e99caaf05290294f2d0fe49c12a3f17102d01c441bd29", size = 2752118, upload-time = "2024-05-09T18:33:15.489Z" }, +] + +[[package]] +name = "pytest" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/86/9e3c5f48f7b7b638b216e4b9e645f54d199d7abbbab7a64a13b4e12ba10f/pytest_asyncio-1.2.0.tar.gz", hash = "sha256:c609a64a2a8768462d0c99811ddb8bd2583c33fd33cf7f21af1c142e824ffb57", size = 50119, upload-time = "2025-09-12T07:33:53.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/93/2fa34714b7a4ae72f2f8dad66ba17dd9a2c793220719e736dda28b7aec27/pytest_asyncio-1.2.0-py3-none-any.whl", hash = "sha256:8e17ae5e46d8e7efe51ab6494dd2010f4ca8dae51652aa3c8d55acf50bfb2e99", size = 15095, upload-time = "2025-09-12T07:33:52.639Z" }, +] + +[[package]] +name = "pytest-databases" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docker" }, + { name = "filelock" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/39/25d33c0246ed8f99ba82fb3c998400bbb704a9874f3eb6791b90f361a043/pytest_databases-0.15.0.tar.gz", hash = "sha256:e1b8cda6d1976def17658cc0e9c07ec70aed0126020b724fb3700e2880c15883", size = 215682, upload-time = "2025-10-06T21:30:48.504Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/31/48b9168189cb62bca61eca2f05a323cb44c7e65b04a43cde5732a95b88f8/pytest_databases-0.15.0-py3-none-any.whl", hash = "sha256:a2b01053def11264e18fd405ee68c07ce5accafc0872310539bc0d669bbf922c", size = 28734, upload-time = "2025-10-06T21:30:46.999Z" }, +] + +[package.optional-dependencies] +postgres = [ + { name = "psycopg" }, +] + +[[package]] +name = "python-dotenv" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "rich" +version = "14.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, +] + +[[package]] +name = "rich-click" +version = "1.9.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "rich" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/90/95cff624a176de6d00a4ddc4fb0238649bca09c19bd37d5b8d1962f8dcfc/rich_click-1.9.3.tar.gz", hash = "sha256:60839150a935604df1378b159da340d3fff91f912903e935da7cb615b5738c1b", size = 73549, upload-time = "2025-10-09T18:00:40.455Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/76/5679d9eee13b8670084d2fe5d7933931b50fd896391693ba690f63916d66/rich_click-1.9.3-py3-none-any.whl", hash = "sha256:8ef51bc340db4d048a846c15c035d27b88acf720cbbb9b6fecf6c8b1a297b909", size = 70168, upload-time = "2025-10-09T18:00:39.464Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.44" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/f2/840d7b9496825333f532d2e3976b8eadbf52034178aac53630d09fe6e1ef/sqlalchemy-2.0.44.tar.gz", hash = "sha256:0ae7454e1ab1d780aee69fd2aae7d6b8670a581d8847f2d1e0f7ddfbf47e5a22", size = 9819830, upload-time = "2025-10-10T14:39:12.935Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/d3/c67077a2249fdb455246e6853166360054c331db4613cda3e31ab1cadbef/sqlalchemy-2.0.44-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ff486e183d151e51b1d694c7aa1695747599bb00b9f5f604092b54b74c64a8e1", size = 2135479, upload-time = "2025-10-10T16:03:37.671Z" }, + { url = "https://files.pythonhosted.org/packages/2b/91/eabd0688330d6fd114f5f12c4f89b0d02929f525e6bf7ff80aa17ca802af/sqlalchemy-2.0.44-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b1af8392eb27b372ddb783b317dea0f650241cea5bd29199b22235299ca2e45", size = 2123212, upload-time = "2025-10-10T16:03:41.755Z" }, + { url = "https://files.pythonhosted.org/packages/b0/bb/43e246cfe0e81c018076a16036d9b548c4cc649de241fa27d8d9ca6f85ab/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b61188657e3a2b9ac4e8f04d6cf8e51046e28175f79464c67f2fd35bceb0976", size = 3255353, upload-time = "2025-10-10T15:35:31.221Z" }, + { url = "https://files.pythonhosted.org/packages/b9/96/c6105ed9a880abe346b64d3b6ddef269ddfcab04f7f3d90a0bf3c5a88e82/sqlalchemy-2.0.44-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b87e7b91a5d5973dda5f00cd61ef72ad75a1db73a386b62877d4875a8840959c", size = 3260222, upload-time = "2025-10-10T15:43:50.124Z" }, + { url = "https://files.pythonhosted.org/packages/44/16/1857e35a47155b5ad927272fee81ae49d398959cb749edca6eaa399b582f/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:15f3326f7f0b2bfe406ee562e17f43f36e16167af99c4c0df61db668de20002d", size = 3189614, upload-time = "2025-10-10T15:35:32.578Z" }, + { url = "https://files.pythonhosted.org/packages/88/ee/4afb39a8ee4fc786e2d716c20ab87b5b1fb33d4ac4129a1aaa574ae8a585/sqlalchemy-2.0.44-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e77faf6ff919aa8cd63f1c4e561cac1d9a454a191bb864d5dd5e545935e5a40", size = 3226248, upload-time = "2025-10-10T15:43:51.862Z" }, + { url = "https://files.pythonhosted.org/packages/32/d5/0e66097fc64fa266f29a7963296b40a80d6a997b7ac13806183700676f86/sqlalchemy-2.0.44-cp313-cp313-win32.whl", hash = "sha256:ee51625c2d51f8baadf2829fae817ad0b66b140573939dd69284d2ba3553ae73", size = 2101275, upload-time = "2025-10-10T15:03:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/03/51/665617fe4f8c6450f42a6d8d69243f9420f5677395572c2fe9d21b493b7b/sqlalchemy-2.0.44-cp313-cp313-win_amd64.whl", hash = "sha256:c1c80faaee1a6c3428cecf40d16a2365bcf56c424c92c2b6f0f9ad204b899e9e", size = 2127901, upload-time = "2025-10-10T15:03:27.548Z" }, + { url = "https://files.pythonhosted.org/packages/9c/5e/6a29fa884d9fb7ddadf6b69490a9d45fded3b38541713010dad16b77d015/sqlalchemy-2.0.44-py3-none-any.whl", hash = "sha256:19de7ca1246fbef9f9d1bff8f1ab25641569df226364a0e40457dc5457c54b05", size = 1928718, upload-time = "2025-10-10T15:29:45.32Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/57/1616c8274c3442d802621abf5deb230771c7a0fec9414cb6763900eb3868/uvicorn-0.37.0.tar.gz", hash = "sha256:4115c8add6d3fd536c8ee77f0e14a7fd2ebba939fed9b02583a97f80648f9e13", size = 80367, upload-time = "2025-09-23T13:33:47.486Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/cd/584a2ceb5532af99dd09e50919e3615ba99aa127e9850eafe5f31ddfdb9a/uvicorn-0.37.0-py3-none-any.whl", hash = "sha256:913b2b88672343739927ce381ff9e2ad62541f9f8289664fa1d1d3803fa2ce6c", size = 67976, upload-time = "2025-09-23T13:33:45.842Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, +] + +[[package]] +name = "xmltodict" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/aa/917ceeed4dbb80d2f04dbd0c784b7ee7bba8ae5a54837ef0e5e062cd3cfb/xmltodict-1.0.2.tar.gz", hash = "sha256:54306780b7c2175a3967cad1db92f218207e5bc1aba697d887807c0fb68b7649", size = 25725, upload-time = "2025-09-17T21:59:26.459Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/20/69a0e6058bc5ea74892d089d64dfc3a62ba78917ec5e2cfa70f7c92ba3a5/xmltodict-1.0.2-py3-none-any.whl", hash = "sha256:62d0fddb0dcbc9f642745d8bbf4d81fd17d6dfaec5a15b5c1876300aad92af0d", size = 13893, upload-time = "2025-09-17T21:59:24.859Z" }, +] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5c20d61 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,80 @@ +--- +services: + db: + image: postgres:17 + + networks: + - backend-network + + volumes: + - postgres_data:/var/lib/postgresql/data + + restart: unless-stopped + + environment: + POSTGRES_USER: ${CHITAI_POSTGRES_USER} + POSTGRES_PASSWORD: ${CHITAI_POSTGRES_PASSWORD} + POSTGRES_DB: ${CHITAI_POSTGRES_DB} + + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${CHITAI_POSTGRES_USER} -d ${CHITAI_POSTGRES_DB}"] + interval: 10s + timeout: 3s + retries: 5 + + + backend: + build: ./backend + + networks: + - backend-network + - frontend-network + + ports: + - "8000:8000" + + volumes: + # Bind mount your libraries into /app/libraries/ + # - ./books:/app/libraries/books + # ... + # Or bind mount entire libraries folder + - ./libraries:/app/libraries + + # Mount book covers directory + - book_covers:/app/covers + + restart: unless-stopped + + env_file: + - .env + + depends_on: + db: + condition: service_healthy + + frontend: + build: ./frontend + + networks: + - frontend-network + + ports: + - "3000:3000" + + restart: unless-stopped + + environment: + VITE_BACKEND_API_URL: ${CHITAI_API_URL} + + depends_on: + backend: + condition: service_healthy + +volumes: + postgres_data: + book_covers: + +networks: + frontend-network: + backend-network: + diff --git a/docs/screenshots/README.md b/docs/screenshots/README.md new file mode 100644 index 0000000..17d15f8 --- /dev/null +++ b/docs/screenshots/README.md @@ -0,0 +1,34 @@ +# Application Screenshots + +This directory contains screenshots showcasing the key features and user interface of the application. + +--- + +## Screenshot 1: Library Home Page + +![Library Home Page](library-home.png) + +--- + +## Screenshot 2: Library Home Page Dark + +![Library Home Page Dark](library-home-dark.png) + + +--- + +## Screenshot 3: Library View Page + +![Library View Page](library-view-filter-menu-visible.png) + +--- + +## Screenshot 4: Book Detail Page + +![[Book Detail Page]](book-detail.png) + + +## Screeshot 5: EPUB Reader + +![[Epub Reader]](epub-reader.png) +--- diff --git a/docs/screenshots/book-detail.png b/docs/screenshots/book-detail.png new file mode 100644 index 0000000..65f0680 Binary files /dev/null and b/docs/screenshots/book-detail.png differ diff --git a/docs/screenshots/epub-reader.png b/docs/screenshots/epub-reader.png new file mode 100644 index 0000000..0663ed2 Binary files /dev/null and b/docs/screenshots/epub-reader.png differ diff --git a/docs/screenshots/library-home-dark.png b/docs/screenshots/library-home-dark.png new file mode 100644 index 0000000..1009055 Binary files /dev/null and b/docs/screenshots/library-home-dark.png differ diff --git a/docs/screenshots/library-home.png b/docs/screenshots/library-home.png new file mode 100644 index 0000000..5d92cd2 Binary files /dev/null and b/docs/screenshots/library-home.png differ diff --git a/docs/screenshots/library-view-filter-menu-visible.png b/docs/screenshots/library-view-filter-menu-visible.png new file mode 100644 index 0000000..118233e Binary files /dev/null and b/docs/screenshots/library-view-filter-menu-visible.png differ diff --git a/docs/screenshots/library-view.png b/docs/screenshots/library-view.png new file mode 100644 index 0000000..39ac0e0 Binary files /dev/null and b/docs/screenshots/library-view.png differ diff --git a/frontend/.dockerignore b/frontend/.dockerignore new file mode 100644 index 0000000..f17f5f7 --- /dev/null +++ b/frontend/.dockerignore @@ -0,0 +1,31 @@ +# Dependencies +node_modules +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# Build outputs +.svelte-kit +build +dist + +# IDE and editor files +.vscode +.idea + +# Environment files +.env +.env.* +!.env.example + +# Docker files +Dockerfile* +docker-compose*.yml +.dockerignore + +# Git +.git +.gitignore +.gitattributes \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..3b462cb --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000..b6f27f1 --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..be19ecc --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,13 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Ignore artifacts: +build +coverage + +# Miscellaneous +/static/ diff --git a/frontend/.prettierrc b/frontend/.prettierrc new file mode 100644 index 0000000..8103a0b --- /dev/null +++ b/frontend/.prettierrc @@ -0,0 +1,16 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ], + "tailwindStylesheet": "./src/app.css" +} diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..1510e77 --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,57 @@ +FROM node:24-slim AS base + +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" + +RUN corepack enable + +WORKDIR /app + + + +FROM base AS prod-deps + +COPY pnpm-lock.yaml ./ + +RUN --mount=type=cache,target=/pnpm/store \ + pnpm fetch --frozen-lockfile + +COPY package.json ./ + +RUN --mount=type=cache,target=/pnpm/store \ + pnpm install --frozen-lockfile --prod --offline + + + +FROM base AS build + +COPY pnpm-lock.yaml package.json ./ + +RUN --mount=type=cache,target=/pnpm/store \ + pnpm install --frozen-lockfile + +COPY . . + +RUN pnpm run build + + + +FROM node:24-slim + +# Setup a non-root user +RUN groupadd -g 9999 appuser && \ + useradd -u 9999 -g appuser -m -d /app -s /sbin/nologin appuser + +COPY --from=prod-deps --chown=appuser:appuser /app/node_modules /app/node_modules +COPY --from=build --chown=appuser:appuser /app/build /app/build + +USER appuser + +ENV ORIGIN=http://localhost:3000 +ENV BODY_SIZE_LIMIT=2G + +EXPOSE 3000 + +WORKDIR /app + +CMD [ "node", "build" ] diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..75842c4 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/frontend/components.json b/frontend/components.json new file mode 100644 index 0000000..c5d91b4 --- /dev/null +++ b/frontend/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "tailwind": { + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks", + "lib": "$lib" + }, + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" +} diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js new file mode 100644 index 0000000..2c49fa6 --- /dev/null +++ b/frontend/eslint.config.js @@ -0,0 +1,41 @@ +import prettier from 'eslint-config-prettier'; +import { fileURLToPath } from 'node:url'; +import { includeIgnoreFile } from '@eslint/compat'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import { defineConfig } from 'eslint/config'; +import globals from 'globals'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); + +export default defineConfig( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node } + }, + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off' + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig + } + } + } +); diff --git a/frontend/jsrepo.json b/frontend/jsrepo.json new file mode 100644 index 0000000..3fd1e21 --- /dev/null +++ b/frontend/jsrepo.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://unpkg.com/jsrepo@2.5.0/schemas/project-config.json", + "repos": ["@ieedan/shadcn-svelte-extras"], + "includeTests": false, + "includeDocs": false, + "watermark": true, + "formatter": "prettier", + "configFiles": {}, + "paths": { + "*": "./src/lib/blocks", + "ui": "$lib/components/ui", + "actions": "$lib/actions", + "hooks": "$lib/hooks", + "utils": "$lib/utils" + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..b3ffd14 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,55 @@ +{ + "name": "chitai-web", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint ." + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.38.0", + "@iconify/svelte": "^5.0.2", + "@internationalized/date": "^3.10.0", + "@lucide/svelte": "^0.544.0", + "@sveltejs/adapter-node": "^5.4.0", + "@sveltejs/kit": "^2.48.0", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@tailwindcss/vite": "^4.1.16", + "@types/node": "^22.18.12", + "bits-ui": "^2.14.0", + "clsx": "^2.1.1", + "eslint": "^9.38.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.12.5", + "globals": "^16.4.0", + "jsrepo": "^2.5.0", + "openapi-typescript": "^7.10.1", + "prettier": "^3.6.2", + "prettier-plugin-svelte": "^3.4.0", + "prettier-plugin-tailwindcss": "^0.6.14", + "svelte": "^5.41.0", + "svelte-check": "^4.3.3", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar": "^4.0.2", + "tailwind-variants": "^3.1.1", + "tailwindcss": "^4.1.16", + "tw-animate-css": "^1.4.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2", + "vite": "^7.1.12" + }, + "dependencies": { + "epubjs": "^0.3.93", + "mode-watcher": "^1.1.0", + "svelte-sonner": "^1.0.5", + "zod": "^4.1.12" + } +} diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..857a627 --- /dev/null +++ b/frontend/pnpm-lock.yaml @@ -0,0 +1,4715 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + epubjs: + specifier: ^0.3.93 + version: 0.3.93 + mode-watcher: + specifier: ^1.1.0 + version: 1.1.0(svelte@5.41.0) + svelte-sonner: + specifier: ^1.0.5 + version: 1.0.5(svelte@5.41.0) + zod: + specifier: ^4.1.12 + version: 4.1.12 + devDependencies: + '@eslint/compat': + specifier: ^1.4.0 + version: 1.4.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint/js': + specifier: ^9.38.0 + version: 9.38.0 + '@iconify/svelte': + specifier: ^5.0.2 + version: 5.0.2(svelte@5.41.0) + '@internationalized/date': + specifier: ^3.10.0 + version: 3.10.0 + '@lucide/svelte': + specifier: ^0.544.0 + version: 0.544.0(svelte@5.41.0) + '@sveltejs/adapter-node': + specifier: ^5.4.0 + version: 5.4.0(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2))) + '@sveltejs/kit': + specifier: ^2.48.0 + version: 2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.1 + version: 6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + '@tailwindcss/vite': + specifier: ^4.1.16 + version: 4.1.16(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + '@types/node': + specifier: ^22.18.12 + version: 22.18.12 + bits-ui: + specifier: ^2.14.0 + version: 2.14.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + eslint: + specifier: ^9.38.0 + version: 9.38.0(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-svelte: + specifier: ^3.12.5 + version: 3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@5.41.0) + globals: + specifier: ^16.4.0 + version: 16.4.0 + jsrepo: + specifier: ^2.5.0 + version: 2.5.0(typescript@5.9.3)(zod@4.1.12) + openapi-typescript: + specifier: ^7.10.1 + version: 7.10.1(typescript@5.9.3) + prettier: + specifier: ^3.6.2 + version: 3.6.2 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@5.41.0) + prettier-plugin-tailwindcss: + specifier: ^0.6.14 + version: 0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.0))(prettier@3.6.2) + svelte: + specifier: ^5.41.0 + version: 5.41.0 + svelte-check: + specifier: ^4.3.3 + version: 4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.3) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tailwind-scrollbar: + specifier: ^4.0.2 + version: 4.0.2(react@19.2.0)(tailwindcss@4.1.16) + tailwind-variants: + specifier: ^3.1.1 + version: 3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.16) + tailwindcss: + specifier: ^4.1.16 + version: 4.1.16 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.46.2 + version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + vite: + specifier: ^7.1.12 + version: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + +packages: + + '@anthropic-ai/sdk@0.62.0': + resolution: {integrity: sha512-gT2VFKX0gSp7KJNlav/vzRFjJOPYDZxCJRx7MYUc+fqURc5aS6OI/UJeD2KytJkjsIWv0OOwH1ePc1S5QE2GZw==} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@biomejs/js-api@3.0.0': + resolution: {integrity: sha512-5QcGJFj9IO+yXl76ICjvkdE38uxRcTDsBzcCZHEZ+ma+Te/nbvJg4A3KtAds9HCrEF0JKLWiyjMhAbqazuJvYA==} + peerDependencies: + '@biomejs/wasm-bundler': ^2.2.0 + '@biomejs/wasm-nodejs': ^2.2.0 + '@biomejs/wasm-web': ^2.2.0 + peerDependenciesMeta: + '@biomejs/wasm-bundler': + optional: true + '@biomejs/wasm-nodejs': + optional: true + '@biomejs/wasm-web': + optional: true + + '@biomejs/wasm-nodejs@2.3.1': + resolution: {integrity: sha512-P9XIcIr8yAkCAMBVGlorpDDJ0AaUNwvn7NGlXAicySC8lqmWRzwJYTweGhOopoxrbdYm10ov3WsXQ5VScSKSbQ==} + + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} + + '@emnapi/core@1.6.0': + resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + + '@emnapi/runtime@1.6.0': + resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@1.4.0': + resolution: {integrity: sha512-DEzm5dKeDBPm3r08Ixli/0cmxr8LkRdwxMRUIJBlSCpAwSrvFEJpVBzV+66JhDxiaqKxnRzCXhtiMiczF7Hglg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.1': + resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.16.0': + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.38.0': + resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.0': + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@iconify/svelte@5.0.2': + resolution: {integrity: sha512-1iWUT+1veS/QOAzKDG0NPgBtJYGoJqEPwF97voTm8jw6PQ6yU0hL73lEwFoTGMrZmatLvh9cjRBmeSHHaltmrg==} + peerDependencies: + svelte: '>4.0.0' + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@internationalized/date@3.10.0': + resolution: {integrity: sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lucide/svelte@0.544.0': + resolution: {integrity: sha512-9f9O6uxng2pLB01sxNySHduJN3HTl5p0HDu4H26VR51vhZfiMzyOMe9Mhof3XAk4l813eTtl+/DYRvGyoRR+yw==} + peerDependencies: + svelte: ^5 + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@oxc-parser/binding-darwin-arm64@0.72.3': + resolution: {integrity: sha512-g6wgcfL7At4wHNHutl0NmPZTAju+cUSmSX5WGUMyTJmozRzhx8E9a2KL4rTqNJPwEpbCFrgC29qX9f4fpDnUpA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.72.3': + resolution: {integrity: sha512-pc+tplB2fd0AqdnXY90FguqSF2OwbxXwrMOLAMmsUiK4/ytr8Z/ftd49+d27GgvQJKeg2LfnIbskaQtY/j2tAA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.72.3': + resolution: {integrity: sha512-igBR6rOvL8t5SBm1f1rjtWNsjB53HNrM3au582JpYzWxOqCjeA5Jlm9KZbjQJC+J8SPB9xyljM7G+6yGZ2UAkQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.72.3': + resolution: {integrity: sha512-/izdr3wg7bK+2RmNhZXC2fQwxbaTH3ELeqdR+Wg4FiEJ/C7ZBIjfB0E734bZGgbDu+rbEJTBlbG77XzY0wRX/Q==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.72.3': + resolution: {integrity: sha512-Vz7C+qJb22HIFl3zXMlwvlTOR+MaIp5ps78060zsdeZh2PUGlYuUYkYXtGEjJV3kc8aKFj79XKqAY1EPG2NWQA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.72.3': + resolution: {integrity: sha512-nomoMe2VpVxW767jhF+G3mDGmE0U6nvvi5nw9Edqd/5DIylQfq/lEGUWL7qITk+E72YXBsnwHtpRRlIAJOMyZg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.72.3': + resolution: {integrity: sha512-4DswiIK5dI7hFqcMKWtZ7IZnWkRuskh6poI1ad4gkY2p678NOGtl6uOGCCRlDmLOOhp3R27u4VCTzQ6zra977w==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.72.3': + resolution: {integrity: sha512-R9GEiA4WFPGU/3RxAhEd6SaMdpqongGTvGEyTvYCS/MAQyXKxX/LFvc2xwjdvESpjIemmc/12aTTq6if28vHkQ==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.72.3': + resolution: {integrity: sha512-/sEYJQMVqikZO8gK9VDPT4zXo9du3gvvu8jp6erMmW5ev+14PErWRypJjktp0qoTj+uq4MzXro0tg7U+t5hP1w==} + engines: {node: '>=14.0.0'} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.72.3': + resolution: {integrity: sha512-hlyljEZ0sMPKJQCd5pxnRh2sAf/w+Ot2iJecgV9Hl3brrYrYCK2kofC0DFaJM3NRmG/8ZB3PlxnSRSKZTocwCw==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.72.3': + resolution: {integrity: sha512-T17S8ORqAIq+YDFMvLfbNdAiYHYDM1+sLMNhesR5eWBtyTHX510/NbgEvcNemO9N6BNR7m4A9o+q468UG+dmbg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.72.3': + resolution: {integrity: sha512-x0Ojn/jyRUk6MllvVB/puSvI2tczZBIYweKVYHNv1nBatjPRiqo+6/uXiKrZwSfGLkGARrKkTuHSa5RdZBMOdA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.72.3': + resolution: {integrity: sha512-kRVAl87ugRjLZTm9vGUyiXU50mqxLPHY81rgnZUP1HtNcqcmTQtM/wUKQL2UdqvhA6xm6zciqzqCgJfU+RW8uA==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.72.3': + resolution: {integrity: sha512-vpVdoGAP5iGE5tIEPJgr7FkQJZA+sKjMkg5x1jarWJ1nnBamfGsfYiZum4QjCfW7jb+pl42rHVSS3lRmMPcyrQ==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.72.3': + resolution: {integrity: sha512-CfAC4wrmMkUoISpQkFAIfMVvlPfQV3xg7ZlcqPXPOIMQhdKIId44G8W0mCPgtpWdFFAyJ+SFtiM+9vbyCkoVng==} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@redocly/ajv@8.11.3': + resolution: {integrity: sha512-4P3iZse91TkBiY+Dx5DUgxQ9GXkVJf++cmI0MOyLDxV9b5MUBI4II6ES8zA5JCbO72nKAJxWrw4PUPW+YP3ZDQ==} + + '@redocly/config@0.22.2': + resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} + + '@redocly/openapi-core@1.34.5': + resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + + '@rollup/plugin-commonjs@28.0.9': + resolution: {integrity: sha512-PIR4/OHZ79romx0BVVll/PkwWpJ7e5lsqFa3gFfcrFPWwLXLV39JVUzQV9RKjWerE7B845Hqjj9VYlQeieZ2dA==} + engines: {node: '>=16.0.0 || 14 >= 14.17'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@16.0.3': + resolution: {integrity: sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@sveltejs/acorn-typescript@1.0.6': + resolution: {integrity: sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-node@5.4.0': + resolution: {integrity: sha512-NMsrwGVPEn+J73zH83Uhss/hYYZN6zT3u31R3IHAn3MiKC3h8fjmIAhLfTSOeNHr5wPYfjjMg8E+1gyFgyrEcQ==} + peerDependencies: + '@sveltejs/kit': ^2.4.0 + + '@sveltejs/kit@2.48.0': + resolution: {integrity: sha512-GAAbkWrbRJvysL7+HOWs5v/+TmnRcEQPeED2sUcDFTHpPvRYADEtScL6x8hWuKp0DKauJVaVJLTjQVy9e7cMiw==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.2.1': + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/node@4.1.16': + resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} + + '@tailwindcss/oxide-android-arm64@4.1.16': + resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.16': + resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.16': + resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.16': + resolution: {integrity: sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tmcp/adapter-valibot@0.1.4': + resolution: {integrity: sha512-/fGCUz/L5RLCYC4L0Mo6s9Z9cSIIPztuHfIkhyo3WjMPTjQWUkFulA47sZSWRTaz5eKQxm5fV1qcfT7zHSuY3Q==} + peerDependencies: + tmcp: ^1.10.2 + valibot: ^1.1.0 + + '@tmcp/transport-stdio@0.1.3': + resolution: {integrity: sha512-xRQ5+M2E6MXJXt0aw26ezoV3r5navrhvg545LkaWg5SjD7ovITLUiCJ5fgP7L5kWeb9GpEiFqxhqFkli+7tz6A==} + peerDependencies: + tmcp: ^1.10.2 + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/localforage@0.0.34': + resolution: {integrity: sha512-tJxahnjm9dEI1X+hQSC5f2BSd/coZaqbIl1m3TCl0q9SVuC52XcXfV0XmoCU1+PmjyucuVITwoTnN8OlTbEXXA==} + deprecated: This is a stub types definition for localforage (https://github.com/localForage/localForage). localforage provides its own type definitions, so you don't need @types/localforage installed! + + '@types/node@22.18.12': + resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + + '@types/prismjs@1.26.5': + resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@typescript-eslint/eslint-plugin@8.46.2': + resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.2 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.46.2': + resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.46.2': + resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.46.2': + resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.46.2': + resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.46.2': + resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.46.2': + resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.46.2': + resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.46.2': + resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.46.2': + resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@valibot/to-json-schema@1.3.0': + resolution: {integrity: sha512-82Vv6x7sOYhv5YmTRgSppSqj1nn2pMCk5BqCMGWYp0V/fq+qirrbGncqZAtZ09/lrO40ne/7z8ejwE728aVreg==} + peerDependencies: + valibot: ^1.1.0 + + '@vue/compiler-core@3.5.22': + resolution: {integrity: sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==} + + '@vue/compiler-dom@3.5.22': + resolution: {integrity: sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==} + + '@vue/compiler-sfc@3.5.22': + resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==} + + '@vue/compiler-ssr@3.5.22': + resolution: {integrity: sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==} + + '@vue/reactivity@3.5.22': + resolution: {integrity: sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==} + + '@vue/runtime-core@3.5.22': + resolution: {integrity: sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==} + + '@vue/runtime-dom@3.5.22': + resolution: {integrity: sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==} + + '@vue/server-renderer@3.5.22': + resolution: {integrity: sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==} + peerDependencies: + vue: 3.5.22 + + '@vue/shared@3.5.22': + resolution: {integrity: sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==} + + '@xmldom/xmldom@0.7.13': + resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} + engines: {node: '>=10.0.0'} + deprecated: this version is no longer supported, please update to at least 0.8.* + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bits-ui@2.14.0: + resolution: {integrity: sha512-XKYLhsg7ThLXbhYldJHerAeAMKCoU9eSntYJIYJym9ah3rqL1cvg0yGBT/8e23I7RYsgh0F1pihaOJbuCJ0IJA==} + engines: {node: '>=20'} + peerDependencies: + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + cacache@20.0.1: + resolution: {integrity: sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@1.4.0: + resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + conf@14.0.0: + resolution: {integrity: sha512-L6BuueHTRuJHQvQVc6YXYZRtN5vJUtOdCTLn0tRYYV5azfbAFcPghB5zEE40mVrV6w7slMTqUfkDomutIK14fw==} + engines: {node: '>=20'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-dependency@0.0.3: + resolution: {integrity: sha512-jLQuve6jhpjkH3+k2Y8jK3j27Hm3rnIsRW/8oOf9oxFOBI5iu6sndwSv6lj5dNfO9JVP6cNb8Xs+VXhndgtLfQ==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.4.2: + resolution: {integrity: sha512-MwPZTKEPK2k8Qgfmqrd48ZKVvzSQjgW0lXLxiIBA8dQjtf/6mw6pggHNLcyDKyf+fI6eXxlQwPsfaCMTU5U+Bw==} + + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} + + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + epubjs@0.3.93: + resolution: {integrity: sha512-c06pNSdBxcXv3dZSbXAVLE1/pmleRhOT6mXNZo6INKmvuKpYB65MwU/lO7830czCtjIiK9i+KR+3S+p0wtljrw==} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-svelte@3.12.5: + resolution: {integrity: sha512-4KRG84eAHQfYd9OjZ1K7sCHy0nox+9KwT+s5WCCku3jTim5RV4tVENob274nCwIaApXsYPKAUAZFBxKZ3Wyfjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.38.0: + resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrap@2.1.1: + resolution: {integrity: sha512-ebTT9B6lOtZGMgJ3o5r12wBacHctG7oEWazIda8UlPfA3HD/Wrv8FdXoVo73vzdpwCxNyXjPauyN2bbJzMkB9A==} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + inline-style-parser@0.2.6: + resolution: {integrity: sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==} + + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-levenshtein@1.1.6: + resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} + engines: {node: '>=0.10.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-rpc-2.0@1.7.1: + resolution: {integrity: sha512-JqZjhjAanbpkXIzFE7u8mE/iFblawwlXtONaCvRqI+pyABVz7B4M1EUNpyVW+dZjqgQ2L5HFmZCmOCgUKm00hg==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema-typed@8.0.1: + resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsrepo@2.5.0: + resolution: {integrity: sha512-EqpHL5LuclcnNJO3TxL1lUNgu1bUel5vf8Zekp4RI7pHN8YcTL3HgL2LcLwX/cAOqghSosR5VX4mv2fbENTsIw==} + hasBin: true + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-fetch-happen@15.0.2: + resolution: {integrity: sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + marks-pane@1.0.9: + resolution: {integrity: sha512-Ahs4oeG90tbdPWwAJkAAoHg2lRR8lAs9mZXETNPO9hYg3AkjUJBKi1NQ4aaIQZVGrig7c/3NUV1jANl8rFTeMg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mode-watcher@1.1.0: + resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} + peerDependencies: + svelte: ^5.27.0 + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-machine-id@1.1.12: + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + + ollama@0.5.18: + resolution: {integrity: sha512-lTFqTf9bo7Cd3hpF6CviBe/DEhewjoZYd9N/uCe7O20qYTvGqrNOFOBDj3lbZgFWHUgDv5EeyusYxsZSLS8nvg==} + + openai@5.23.2: + resolution: {integrity: sha512-MQBzmTulj+MM5O8SKEk/gL8a7s5mktS9zUtAkU257WjvobGc9nKcBuVwjyEEcb9SI8a8Y2G/mzn3vm9n1Jlleg==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + openapi-typescript@7.10.1: + resolution: {integrity: sha512-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw==} + hasBin: true + peerDependencies: + typescript: ^5.x + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + oxc-parser@0.72.3: + resolution: {integrity: sha512-JYQeJKDcUTTZ/uTdJ+fZBGFjAjkLD1h0p3Tf44ZYXRcoMk+57d81paNPFAAwzrzzqhZmkGvKKXDxwyhJXYZlpg==} + engines: {node: '>=14.0.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-webpack@0.0.3: + resolution: {integrity: sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + prism-react-renderer@2.4.1: + resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} + peerDependencies: + react: '>=16.0.0' + + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.25.0: + resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.28.0: + resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.35.1: + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} + peerDependencies: + '@sveltejs/kit': ^2.21.0 + svelte: ^5.7.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + sqids@0.3.0: + resolution: {integrity: sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.1: + resolution: {integrity: sha512-bwtct4FpoH1eYdSMFc84fxnYynWwsy2u0joj94K+6caiPnjZIpwTLHT2u7CFAS0GumaBZVB5Y2GkJ46mJS76qg==} + + style-to-object@1.0.12: + resolution: {integrity: sha512-ddJqYnoT4t97QvN2C95bCgt+m7AAgXjVnkk/jxAfmp7EAB8nnqqZYEbMd3em7/vEomDb2LAQKAy1RFfv41mdNw==} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte-check@4.3.3: + resolution: {integrity: sha512-RYP0bEwenDXzfv0P1sKAwjZSlaRyqBn0Fz1TVni58lqyEiqgwztTpmodJrGzP6ZT2aHl4MbTvWP6gbmQ3FOnBg==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-eslint-parser@1.4.0: + resolution: {integrity: sha512-fjPzOfipR5S7gQ/JvI9r2H8y9gMGXO3JtmrylHLLyahEMquXI0lrebcjT+9/hNgDej0H7abTyox5HpHmW1PSWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.18.3} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte-sonner@1.0.5: + resolution: {integrity: sha512-9dpGPFqKb/QWudYqGnEz93vuY+NgCEvyNvxoCLMVGw6sDN/3oVeKV1xiEirW2E1N3vJEyj5imSBNOGltQHA7mg==} + peerDependencies: + svelte: ^5.0.0 + + svelte-toolbelt@0.10.6: + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.0.0 + + svelte@5.41.0: + resolution: {integrity: sha512-mP3vFFv5OUM5JN189+nJVW74kQ1dGqUrXTEzvCEVZqessY0GxZDls1nWVvt4Sxyv2USfQvAZO68VRaeIZvpzKg==} + engines: {node: '>=18'} + + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwind-scrollbar@4.0.2: + resolution: {integrity: sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA==} + engines: {node: '>=12.13.0'} + peerDependencies: + tailwindcss: 4.x + + tailwind-variants@3.1.1: + resolution: {integrity: sha512-ftLXe3krnqkMHsuBTEmaVUXYovXtPyTK7ckEfDRXS8PBZx0bAUas+A0jYxuKA5b8qg++wvQ3d2MQ7l/xeZxbZQ==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwind-merge: '>=3.0.0' + tailwindcss: '*' + peerDependenciesMeta: + tailwind-merge: + optional: true + + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.1: + resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + engines: {node: '>=18'} + + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tmcp@1.15.5: + resolution: {integrity: sha512-3Nk2v54+FZKTpwpUnMLdkJ7WdZQqZtsCIZxmEnH/VqXkcmefL5+CGumcL8uyIqcmSc5UFQKqRGrt6GiKfR4j3g==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typescript-eslint@8.46.2: + resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + + uri-js-replace@1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uri-template-matcher@1.1.1: + resolution: {integrity: sha512-ooMjzxaqlquLZZU0Y+Ol+RAp5xav3oJ3qc3gO585QFmB9iX88ip8pflaCKKtkwPd40ro2noB8yQG2OhFddmddg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + valibot@1.1.0: + resolution: {integrity: sha512-Nk8lX30Qhu+9txPYTwM0cFlWLdPFsFr6LblzqIySfbZph9+BFsAHsNvHOymEviUepeIW6KFHzpX8TKhbptBXXw==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vue@3.5.22: + resolution: {integrity: sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + whatwg-fetch@3.6.20: + resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} + + when-exit@2.1.4: + resolution: {integrity: sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml-ast-parser@0.0.43: + resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + +snapshots: + + '@anthropic-ai/sdk@0.62.0': {} + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@biomejs/js-api@3.0.0(@biomejs/wasm-nodejs@2.3.1)': + optionalDependencies: + '@biomejs/wasm-nodejs': 2.3.1 + + '@biomejs/wasm-nodejs@2.3.1': {} + + '@clack/core@0.5.0': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@clack/prompts@0.11.0': + dependencies: + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 + + '@emnapi/core@1.6.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.6.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': + dependencies: + eslint: 9.38.0(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@1.4.0(eslint@9.38.0(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.16.0 + optionalDependencies: + eslint: 9.38.0(jiti@2.6.1) + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@10.2.2) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.1': + dependencies: + '@eslint/core': 0.16.0 + + '@eslint/core@0.16.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.3(supports-color@10.2.2) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.38.0': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.0': + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@iconify/svelte@5.0.2(svelte@5.41.0)': + dependencies: + '@iconify/types': 2.0.0 + svelte: 5.41.0 + + '@iconify/types@2.0.0': {} + + '@internationalized/date@3.10.0': + dependencies: + '@swc/helpers': 0.5.17 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lucide/svelte@0.544.0(svelte@5.41.0)': + dependencies: + svelte: 5.41.0 + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.6.0 + '@emnapi/runtime': 1.6.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/agent@4.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + lru-cache: 11.2.2 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.3 + + '@oxc-parser/binding-darwin-arm64@0.72.3': + optional: true + + '@oxc-parser/binding-darwin-x64@0.72.3': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.72.3': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.72.3': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.72.3': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.72.3': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.72.3': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.72.3': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.72.3': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.72.3': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.72.3': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.72.3': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.72.3': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.72.3': + optional: true + + '@oxc-project/types@0.72.3': {} + + '@polka/url@1.0.0-next.29': {} + + '@redocly/ajv@8.11.3': + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js-replace: 1.0.1 + + '@redocly/config@0.22.2': {} + + '@redocly/openapi-core@1.34.5(supports-color@10.2.2)': + dependencies: + '@redocly/ajv': 8.11.3 + '@redocly/config': 0.22.2 + colorette: 1.4.0 + https-proxy-agent: 7.0.6(supports-color@10.2.2) + js-levenshtein: 1.1.6 + js-yaml: 4.1.0 + minimatch: 5.1.6 + pluralize: 8.0.0 + yaml-ast-parser: 0.0.43 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@28.0.9(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + commondir: 1.0.1 + estree-walker: 2.0.2 + fdir: 6.5.0(picomatch@4.0.3) + is-reference: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/plugin-json@6.1.0(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + optionalDependencies: + rollup: 4.52.5 + + '@rollup/plugin-node-resolve@16.0.3(rollup@4.52.5)': + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.52.5) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.11 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/pluginutils@5.3.0(rollup@4.52.5)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.52.5 + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + + '@standard-schema/spec@1.0.0': {} + + '@sveltejs/acorn-typescript@1.0.6(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-node@5.4.0(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))': + dependencies: + '@rollup/plugin-commonjs': 28.0.9(rollup@4.52.5) + '@rollup/plugin-json': 6.1.0(rollup@4.52.5) + '@rollup/plugin-node-resolve': 16.0.3(rollup@4.52.5) + '@sveltejs/kit': 2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + rollup: 4.52.5 + + '@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.4.2 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.1 + sirv: 3.0.2 + svelte: 5.41.0 + vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + debug: 4.4.3(supports-color@10.2.2) + svelte: 5.41.0 + vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + debug: 4.4.3(supports-color@10.2.2) + deepmerge: 4.3.1 + magic-string: 0.30.21 + svelte: 5.41.0 + vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + vitefu: 1.1.1(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + transitivePeerDependencies: + - supports-color + + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.16': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.16 + + '@tailwindcss/oxide-android-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide@4.1.16': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-x64': 4.1.16 + '@tailwindcss/oxide-freebsd-x64': 4.1.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-x64-musl': 4.1.16 + '@tailwindcss/oxide-wasm32-wasi': 4.1.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 + + '@tailwindcss/vite@4.1.16(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2))': + dependencies: + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 + tailwindcss: 4.1.16 + vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + + '@tmcp/adapter-valibot@0.1.4(tmcp@1.15.5(typescript@5.9.3))(valibot@1.1.0(typescript@5.9.3))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@valibot/to-json-schema': 1.3.0(valibot@1.1.0(typescript@5.9.3)) + tmcp: 1.15.5(typescript@5.9.3) + valibot: 1.1.0(typescript@5.9.3) + + '@tmcp/transport-stdio@0.1.3(tmcp@1.15.5(typescript@5.9.3))': + dependencies: + tmcp: 1.15.5(typescript@5.9.3) + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/localforage@0.0.34': + dependencies: + localforage: 1.10.0 + + '@types/node@22.18.12': + dependencies: + undici-types: 6.21.0 + + '@types/prismjs@1.26.5': {} + + '@types/resolve@1.20.2': {} + + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + eslint: 9.38.0(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + debug: 4.4.3(supports-color@10.2.2) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@10.2.2) + eslint: 9.38.0(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.46.2': {} + + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/visitor-keys': 8.46.2 + debug: 4.4.3(supports-color@10.2.2) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.2 + '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.46.2': + dependencies: + '@typescript-eslint/types': 8.46.2 + eslint-visitor-keys: 4.2.1 + + '@valibot/to-json-schema@1.3.0(valibot@1.1.0(typescript@5.9.3))': + dependencies: + valibot: 1.1.0(typescript@5.9.3) + + '@vue/compiler-core@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.22': + dependencies: + '@vue/compiler-core': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/compiler-sfc@3.5.22': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.22 + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.22': + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/reactivity@3.5.22': + dependencies: + '@vue/shared': 3.5.22 + + '@vue/runtime-core@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/shared': 3.5.22 + + '@vue/runtime-dom@3.5.22': + dependencies: + '@vue/reactivity': 3.5.22 + '@vue/runtime-core': 3.5.22 + '@vue/shared': 3.5.22 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.22(vue@3.5.22(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.22 + '@vue/shared': 3.5.22 + vue: 3.5.22(typescript@5.9.3) + + '@vue/shared@3.5.22': {} + + '@xmldom/xmldom@0.7.13': {} + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.4: {} + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + atomically@2.1.0: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.4 + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + bits-ui@2.14.0(@internationalized/date@3.10.0)(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0): + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/dom': 1.7.4 + '@internationalized/date': 3.10.0 + esm-env: 1.2.2 + runed: 0.35.1(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0) + svelte: 5.41.0 + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0) + tabbable: 6.3.0 + transitivePeerDependencies: + - '@sveltejs/kit' + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + cacache@20.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 11.0.3 + lru-cache: 11.2.2 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + unique-filename: 4.0.0 + + callsites@3.1.0: {} + + camelcase@8.0.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + change-case@5.4.4: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + cli-boxes@3.0.0: {} + + clsx@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@1.4.0: {} + + commander@14.0.2: {} + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + conf@14.0.0: + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + atomically: 2.1.0 + debounce-fn: 6.0.0 + dot-prop: 9.0.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.1 + semver: 7.7.3 + uint8array-extras: 1.5.0 + + cookie@0.6.0: {} + + core-js@3.46.0: {} + + core-util-is@1.0.3: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-dependency@0.0.3: + dependencies: + ansi-regex: 6.2.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + + debug@4.4.3(supports-color@10.2.2): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 10.2.2 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devalue@5.4.2: {} + + diff@8.0.2: {} + + dot-prop@9.0.0: + dependencies: + type-fest: 4.41.0 + + eastasianwidth@0.2.0: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + entities@6.0.1: {} + + env-paths@3.0.0: {} + + epubjs@0.3.93: + dependencies: + '@types/localforage': 0.0.34 + '@xmldom/xmldom': 0.7.13 + core-js: 3.46.0 + event-emitter: 0.3.5 + jszip: 3.10.1 + localforage: 1.10.0 + lodash: 4.17.21 + marks-pane: 1.0.9 + path-webpack: 0.0.3 + + err-code@2.0.3: {} + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): + dependencies: + eslint: 9.38.0(jiti@2.6.1) + + eslint-plugin-svelte@3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@5.41.0): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.38.0(jiti@2.6.1) + esutils: 2.0.3 + globals: 16.4.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.4.0(svelte@5.41.0) + optionalDependencies: + svelte: 5.41.0 + transitivePeerDependencies: + - ts-node + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.38.0(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.1 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.38.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@10.2.2) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + esm-env@1.2.2: {} + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrap@2.1.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + ext@1.7.0: + dependencies: + type: 2.7.3 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.1.0: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-east-asian-width@1.4.0: {} + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.0.3 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + globals@14.0.0: {} + + globals@16.4.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + http-cache-semantics@4.2.0: {} + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6(supports-color@10.2.2): + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ignore@5.3.2: {} + + ignore@7.0.5: {} + + immediate@3.0.6: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + index-to-position@1.2.0: {} + + inherits@2.0.4: {} + + inline-style-parser@0.2.6: {} + + ip-address@10.0.1: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.8 + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + is-unicode-supported@2.1.0: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jiti@2.6.1: {} + + js-levenshtein@1.1.6: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-rpc-2.0@1.7.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsrepo@2.5.0(typescript@5.9.3)(zod@4.1.12): + dependencies: + '@anthropic-ai/sdk': 0.62.0 + '@biomejs/js-api': 3.0.0(@biomejs/wasm-nodejs@2.3.1) + '@biomejs/wasm-nodejs': 2.3.1 + '@clack/prompts': 0.11.0 + '@tmcp/adapter-valibot': 0.1.4(tmcp@1.15.5(typescript@5.9.3))(valibot@1.1.0(typescript@5.9.3)) + '@tmcp/transport-stdio': 0.1.3(tmcp@1.15.5(typescript@5.9.3)) + boxen: 8.0.1 + chalk: 5.6.2 + commander: 14.0.2 + conf: 14.0.0 + css-dependency: 0.0.3 + diff: 8.0.2 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + get-tsconfig: 4.13.0 + ignore: 7.0.5 + is-unicode-supported: 2.1.0 + make-fetch-happen: 15.0.2 + node-machine-id: 1.1.12 + ollama: 0.5.18 + openai: 5.23.2(zod@4.1.12) + oxc-parser: 0.72.3 + package-manager-detector: 1.5.0 + parse5: 8.0.0 + pathe: 2.0.3 + prettier: 3.6.2 + semver: 7.7.3 + sisteransi: 1.0.5 + svelte: 5.41.0 + tar: 7.5.1 + tinyexec: 1.0.1 + tmcp: 1.15.5(typescript@5.9.3) + valibot: 1.1.0(typescript@5.9.3) + validate-npm-package-name: 6.0.2 + vue: 3.5.22(typescript@5.9.3) + transitivePeerDependencies: + - '@biomejs/wasm-bundler' + - '@biomejs/wasm-web' + - supports-color + - typescript + - ws + - zod + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@4.1.5: {} + + known-css-properties@0.37.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.1.1: + dependencies: + immediate: 3.0.6 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + lilconfig@2.1.0: {} + + localforage@1.10.0: + dependencies: + lie: 3.1.1 + + locate-character@3.0.0: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + lru-cache@11.2.2: {} + + lz-string@1.5.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-fetch-happen@15.0.2: + dependencies: + '@npmcli/agent': 4.0.0 + cacache: 20.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + marks-pane@1.0.9: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-function@5.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mode-watcher@1.1.0(svelte@5.41.0): + dependencies: + runed: 0.25.0(svelte@5.41.0) + svelte: 5.41.0 + svelte-toolbelt: 0.7.1(svelte@5.41.0) + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + negotiator@1.0.0: {} + + next-tick@1.1.0: {} + + node-machine-id@1.1.12: {} + + ollama@0.5.18: + dependencies: + whatwg-fetch: 3.6.20 + + openai@5.23.2(zod@4.1.12): + optionalDependencies: + zod: 4.1.12 + + openapi-typescript@7.10.1(typescript@5.9.3): + dependencies: + '@redocly/openapi-core': 1.34.5(supports-color@10.2.2) + ansi-colors: 4.1.3 + change-case: 5.4.4 + parse-json: 8.3.0 + supports-color: 10.2.2 + typescript: 5.9.3 + yargs-parser: 21.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + oxc-parser@0.72.3: + dependencies: + '@oxc-project/types': 0.72.3 + optionalDependencies: + '@oxc-parser/binding-darwin-arm64': 0.72.3 + '@oxc-parser/binding-darwin-x64': 0.72.3 + '@oxc-parser/binding-freebsd-x64': 0.72.3 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.72.3 + '@oxc-parser/binding-linux-arm-musleabihf': 0.72.3 + '@oxc-parser/binding-linux-arm64-gnu': 0.72.3 + '@oxc-parser/binding-linux-arm64-musl': 0.72.3 + '@oxc-parser/binding-linux-riscv64-gnu': 0.72.3 + '@oxc-parser/binding-linux-s390x-gnu': 0.72.3 + '@oxc-parser/binding-linux-x64-gnu': 0.72.3 + '@oxc-parser/binding-linux-x64-musl': 0.72.3 + '@oxc-parser/binding-wasm32-wasi': 0.72.3 + '@oxc-parser/binding-win32-arm64-msvc': 0.72.3 + '@oxc-parser/binding-win32-x64-msvc': 0.72.3 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@7.0.3: {} + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.5.0: {} + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + parse5@8.0.0: + dependencies: + entities: 6.0.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + + path-webpack@0.0.3: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.3: {} + + pluralize@8.0.0: {} + + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.0): + dependencies: + prettier: 3.6.2 + svelte: 5.41.0 + + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.0))(prettier@3.6.2): + dependencies: + prettier: 3.6.2 + optionalDependencies: + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.41.0) + + prettier@3.6.2: {} + + prism-react-renderer@2.4.1(react@19.2.0): + dependencies: + '@types/prismjs': 1.26.5 + clsx: 2.1.1 + react: 19.2.0 + + proc-log@5.0.0: {} + + process-nextick-args@2.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react@19.2.0: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@4.1.2: {} + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.12.0: {} + + reusify@1.1.0: {} + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + runed@0.23.4(svelte@5.41.0): + dependencies: + esm-env: 1.2.2 + svelte: 5.41.0 + + runed@0.25.0(svelte@5.41.0): + dependencies: + esm-env: 1.2.2 + svelte: 5.41.0 + + runed@0.28.0(svelte@5.41.0): + dependencies: + esm-env: 1.2.2 + svelte: 5.41.0 + + runed@0.35.1(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0): + dependencies: + dequal: 2.0.3 + esm-env: 1.2.2 + lz-string: 1.5.0 + svelte: 5.41.0 + optionalDependencies: + '@sveltejs/kit': 2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)) + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-buffer@5.1.2: {} + + safer-buffer@2.1.2: + optional: true + + semver@7.7.3: {} + + set-cookie-parser@2.7.1: {} + + setimmediate@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + smart-buffer@4.2.0: {} + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3(supports-color@10.2.2) + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.0.1 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + sqids@0.3.0: {} + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-json-comments@3.1.1: {} + + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.1 + + stubborn-utils@1.0.1: {} + + style-to-object@1.0.12: + dependencies: + inline-style-parser: 0.2.6 + + supports-color@10.2.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.41.0)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.41.0 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.4.0(svelte@5.41.0): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + optionalDependencies: + svelte: 5.41.0 + + svelte-sonner@1.0.5(svelte@5.41.0): + dependencies: + runed: 0.28.0(svelte@5.41.0) + svelte: 5.41.0 + + svelte-toolbelt@0.10.6(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0): + dependencies: + clsx: 2.1.1 + runed: 0.35.1(@sveltejs/kit@2.48.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.41.0) + style-to-object: 1.0.12 + svelte: 5.41.0 + transitivePeerDependencies: + - '@sveltejs/kit' + + svelte-toolbelt@0.7.1(svelte@5.41.0): + dependencies: + clsx: 2.1.1 + runed: 0.23.4(svelte@5.41.0) + style-to-object: 1.0.12 + svelte: 5.41.0 + + svelte@5.41.0: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.1 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + tabbable@6.3.0: {} + + tailwind-merge@3.3.1: {} + + tailwind-scrollbar@4.0.2(react@19.2.0)(tailwindcss@4.1.16): + dependencies: + prism-react-renderer: 2.4.1(react@19.2.0) + tailwindcss: 4.1.16 + transitivePeerDependencies: + - react + + tailwind-variants@3.1.1(tailwind-merge@3.3.1)(tailwindcss@4.1.16): + dependencies: + tailwindcss: 4.1.16 + optionalDependencies: + tailwind-merge: 3.3.1 + + tailwindcss@4.1.16: {} + + tapable@2.3.0: {} + + tar@7.5.1: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + tinyexec@1.0.1: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tmcp@1.15.5(typescript@5.9.3): + dependencies: + '@standard-schema/spec': 1.0.0 + json-rpc-2.0: 1.7.1 + sqids: 0.3.0 + uri-template-matcher: 1.1.1 + valibot: 1.1.0(typescript@5.9.3) + transitivePeerDependencies: + - typescript + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tslib@2.8.1: {} + + tw-animate-css@1.4.0: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + type@2.7.3: {} + + typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.38.0(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript@5.9.3: {} + + uint8array-extras@1.5.0: {} + + undici-types@6.21.0: {} + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + + uri-js-replace@1.0.1: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uri-template-matcher@1.1.1: {} + + util-deprecate@1.0.2: {} + + valibot@1.1.0(typescript@5.9.3): + optionalDependencies: + typescript: 5.9.3 + + validate-npm-package-name@6.0.2: {} + + vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 22.18.12 + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + + vitefu@1.1.1(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2)): + optionalDependencies: + vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(lightningcss@1.30.2) + + vue@3.5.22(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.22 + '@vue/compiler-sfc': 3.5.22 + '@vue/runtime-dom': 3.5.22 + '@vue/server-renderer': 3.5.22(vue@3.5.22(typescript@5.9.3)) + '@vue/shared': 3.5.22 + optionalDependencies: + typescript: 5.9.3 + + whatwg-fetch@3.6.20: {} + + when-exit@2.1.4: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml-ast-parser@0.0.43: {} + + yaml@1.10.2: {} + + yargs-parser@21.1.1: {} + + yocto-queue@0.1.0: {} + + zimmerframe@1.1.4: {} + + zod@4.1.12: {} diff --git a/frontend/pnpm-workspace.yaml b/frontend/pnpm-workspace.yaml new file mode 100644 index 0000000..5bd78e0 --- /dev/null +++ b/frontend/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +onlyBuiltDependencies: + - esbuild + - '@tailwindcss/oxide' diff --git a/frontend/shell.nix b/frontend/shell.nix new file mode 100644 index 0000000..5ff3dbd --- /dev/null +++ b/frontend/shell.nix @@ -0,0 +1,27 @@ +{ pkgs ? import {} }: + +pkgs.mkShell { + buildInputs = with pkgs; [ + # Node.js ecosystem + nodejs_24 + nodePackages.pnpm + ]; + + shellHook = '' + FRONTEND_PATH=$(dirname ${toString ./.}) + cd $FRONTEND_PATH + + echo "Node.js development environment" + echo "Node version: $(node --version)" + echo "PNPM version: $(pnpm --version)" + + # Install dependencies if package.json exists + if [ -f "package.json" ]; then + echo "Installing npm dependencies..." + pnpm install + fi + + # Return to root directory + cd - + ''; +} diff --git a/frontend/src/app.css b/frontend/src/app.css new file mode 100644 index 0000000..3a6fb71 --- /dev/null +++ b/frontend/src/app.css @@ -0,0 +1,132 @@ +@import 'tailwindcss'; + +@plugin 'tailwind-scrollbar'; + +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.129 0.042 264.695); + --card: oklch(1 0 0); + --card-foreground: oklch(0.129 0.042 264.695); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.129 0.042 264.695); + --primary: oklch(0.208 0.042 265.755); + --primary-foreground: oklch(0.984 0.003 247.858); + --secondary: oklch(0.968 0.007 247.896); + --secondary-foreground: oklch(0.208 0.042 265.755); + --muted: oklch(0.968 0.007 247.896); + --muted-foreground: oklch(0.554 0.046 257.417); + --accent: oklch(0.968 0.007 247.896); + --accent-foreground: oklch(0.208 0.042 265.755); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.929 0.013 255.508); + --input: oklch(0.929 0.013 255.508); + --ring: oklch(0.704 0.04 256.788); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.984 0.003 247.858); + --sidebar-foreground: oklch(0.129 0.042 264.695); + --sidebar-primary: oklch(0.208 0.042 265.755); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.968 0.007 247.896); + --sidebar-accent-foreground: oklch(0.208 0.042 265.755); + --sidebar-border: oklch(0.929 0.013 255.508); + --sidebar-ring: oklch(0.704 0.04 256.788); +} + +.dark { + --background: oklch(0.129 0.042 264.695); + --foreground: oklch(0.984 0.003 247.858); + --card: oklch(0.208 0.042 265.755); + --card-foreground: oklch(0.984 0.003 247.858); + --popover: oklch(0.208 0.042 265.755); + --popover-foreground: oklch(0.984 0.003 247.858); + --primary: oklch(0.929 0.013 255.508); + --primary-foreground: oklch(0.208 0.042 265.755); + --secondary: oklch(0.279 0.041 260.031); + --secondary-foreground: oklch(0.984 0.003 247.858); + --muted: oklch(0.279 0.041 260.031); + --muted-foreground: oklch(0.704 0.04 256.788); + --accent: oklch(0.279 0.041 260.031); + --accent-foreground: oklch(0.984 0.003 247.858); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.551 0.027 264.364); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.208 0.042 265.755); + --sidebar-foreground: oklch(0.984 0.003 247.858); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.984 0.003 247.858); + --sidebar-accent: oklch(0.279 0.041 260.031); + --sidebar-accent-foreground: oklch(0.984 0.003 247.858); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.551 0.027 264.364); +} + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + +/* Comma separated list */ +.cs-list::after { + content: ','; +} + +.cs-list:last-of-type::after { + display: none; +} diff --git a/frontend/src/app.d.ts b/frontend/src/app.d.ts new file mode 100644 index 0000000..6cafeb6 --- /dev/null +++ b/frontend/src/app.d.ts @@ -0,0 +1,21 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces + +import type { ApiClient } from '$lib/server/api'; +import type { User } from 'lucide-svelte'; + +declare global { + namespace App { + // interface Error {} + interface Locals { + authToken: string | null; + api: ApiClient; + user: User; + } + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/frontend/src/app.html b/frontend/src/app.html new file mode 100644 index 0000000..06a6722 --- /dev/null +++ b/frontend/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/frontend/src/hooks.server.ts b/frontend/src/hooks.server.ts new file mode 100644 index 0000000..f7ac519 --- /dev/null +++ b/frontend/src/hooks.server.ts @@ -0,0 +1,37 @@ +import { ApiClient } from '$lib/server/api'; +import { validateToken } from '$lib/server/auth'; +import { redirect, type Handle } from '@sveltejs/kit'; +import { sequence } from '@sveltejs/kit/hooks'; + +const authHandle: Handle = async ({ event, resolve }) => { + // Get auth token from cookies + const authToken = event.cookies.get('authToken'); + + if (authToken) { + // Validate the token + const api = new ApiClient(authToken); + const user = await validateToken(api); + + if (user) { + // Token is valid + event.locals.user = user; + event.locals.authToken = authToken; + event.locals.api = api; + } else { + // Token invalid, clear auth cookie + event.cookies.delete('authToken', { path: '/' }); + } + } + + return resolve(event); +}; + +const protectedRoutesHandle: Handle = async ({ event, resolve }) => { + const isProtectedRoute = !event.url.pathname.startsWith('/login'); + + if (isProtectedRoute && !event.locals.user) throw redirect(303, '/login'); + + return resolve(event); +}; + +export const handle = sequence(authHandle, protectedRoutesHandle); diff --git a/frontend/src/lib/api/auth.remote.ts b/frontend/src/lib/api/auth.remote.ts new file mode 100644 index 0000000..a1ca594 --- /dev/null +++ b/frontend/src/lib/api/auth.remote.ts @@ -0,0 +1,75 @@ +import { command, form, getRequestEvent, query } from '$app/server'; +import { loginSchema, signupSchema } from '$lib/schema/auth'; +import { BACKEND_API_URL } from '$lib/server/config'; +import { redirect } from '@sveltejs/kit'; + +export const login = form(loginSchema, async (data, invalid) => { + const { cookies, locals } = getRequestEvent(); + + // Create URL-encoded form data + const formData = new URLSearchParams(); + formData.append('email', data.email); + formData.append('password', data.password); + + const response = await fetch(`${BACKEND_API_URL}/access/login`, { + method: 'POST', + body: formData, + headers: { 'Content-Type': 'application/x-www-form-urlencoded' } + }); + + if (!response.ok) { + if (response.status === 401) { + invalid(invalid.email('Invalid login credentials')); + } else { + const message = await response.text(); + console.error('Unknown error: ', message); + invalid(invalid.email('An unknown error occurred')); + } + } + + const token = await response.json(); + + cookies.set('authToken', token.access_token, { + path: '/', + httpOnly: true, + secure: true, + sameSite: 'strict', + maxAge: 60 * 60 * 24 * 7 // 1 week + }); + + redirect(303, '/'); +}); + +export const signup = form(signupSchema, async (data, invalid) => { + const response = await fetch(`${BACKEND_API_URL}/access/signup`, { + method: 'POST', + body: JSON.stringify(data), + headers: { 'Content-Type': 'application/json' } + }); + + if (!response.ok) { + if (response.status == 409) { + invalid(invalid.email('Email is already in use by another account')); + } else { + const message = await response.text(); + console.error('Unknown error: ', message); + invalid(invalid.email('An unknown error occurred')); + } + } +}); + +export const logout = command(async () => { + const { cookies } = getRequestEvent(); + + cookies.delete('authToken', { + path: '/' + }); +}); + +export const getUser = query(async () => { + const { locals } = getRequestEvent(); + if (!locals.user) { + redirect(307, '/login'); + } + return locals.user; +}); diff --git a/frontend/src/lib/api/author.remote.ts b/frontend/src/lib/api/author.remote.ts new file mode 100644 index 0000000..1e47230 --- /dev/null +++ b/frontend/src/lib/api/author.remote.ts @@ -0,0 +1,16 @@ +import { getRequestEvent, query } from '$app/server'; +import { authorQuerySchema } from '$lib/schema/author'; +import { createQueryParams } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export const listAuthors = query(authorQuerySchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/authors?${params.toString()}`); + + if (!response.ok) error(500, 'An unkown error occurred'); + + return await response.json(); +}); diff --git a/frontend/src/lib/api/book.remote.ts b/frontend/src/lib/api/book.remote.ts new file mode 100644 index 0000000..21d0b71 --- /dev/null +++ b/frontend/src/lib/api/book.remote.ts @@ -0,0 +1,164 @@ +import { command, form, getRequestEvent, query } from '$app/server'; +import { error } from '@sveltejs/kit'; +import { + bookCoverUpload, + booksUpload, + bookIdsSchema, + bookQuerySchema, + deleteBookFilesSchema, + deleteBooksSchema, + editBookMetadataSchema, + updateBookProgressSchema, + type Book, + bookFilesUpload +} from '$lib/schema/index'; +import { stringCoerce, type PaginatedResponse } from '$lib/schema/common'; +import { createQueryParams } from '$lib/utils'; + +export const getBook = query(stringCoerce, async (id): Promise => { + const { locals } = getRequestEvent(); + + const response = await locals.api.get(`/books/${id}`); + + if (!response.ok) { + if (response.status == 404) error(404, 'The book does not exist'); + error(500, 'An unkown error occurred'); + } + + return await response.json(); +}); + +export const listBooks = query(bookQuerySchema, async (data): Promise> => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/books?${params.toString()}`); + + if (!response.ok) error(500, 'An unkown error occurred'); + + return await response.json(); +}); + +export const updateBookMetadata = form(editBookMetadataSchema, async (data): Promise => { + const { locals } = getRequestEvent(); + + const response = await locals.api.patch(`/books/${data.book_id}`, data); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json(); +}); + +export const updateBookCover = form(bookCoverUpload, async ({ book_id, file }) => { + const { locals } = getRequestEvent(); + + const formData = new FormData(); + formData.append('file', file); + + const response = await locals.api.putMultipart(`/books/${book_id}/cover`, formData); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json(); +}); + +export const uploadBooks = form(booksUpload, async ({ library_id, files }) => { + const { locals } = getRequestEvent(); + + const formData = new FormData(); + files.forEach((file) => { + formData.append('files', file); + }); + + const response = await locals.api.postMultipart( + `/books/fromFiles?library_id=${library_id}`, + formData + ); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json(); +}); + +export const uploadBookFiles = form(bookFilesUpload, async ({ book_id, files }) => { + const { locals } = getRequestEvent(); + + const formData = new FormData(); + files.forEach((file) => { + formData.append('files', file); + }); + + const response = await locals.api.postMultipart(`/books/${book_id}/files`, formData); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json(); +}); + +export const deleteBooks = command(deleteBooksSchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.delete(`/books?${params.toString()}`); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } +}); + +export const deleteBookFiles = command(deleteBookFilesSchema, async ({ book_id, ...data }) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.delete(`/books/${book_id}/files?${params.toString()}`); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } +}); + +export const updateBookProgress = command( + updateBookProgressSchema, + async ({ book_ids, ...data }) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams({ book_ids: book_ids }); + + const response = await locals.api.post(`/books/progress?${params.toString()}`, { ...data }); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + } +); + +export const markBooksAsComplete = command(bookIdsSchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.post(`/books/completed?${params.toString()}`, {}); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } +}); diff --git a/frontend/src/lib/api/bookshelf.remote.ts b/frontend/src/lib/api/bookshelf.remote.ts new file mode 100644 index 0000000..e46ca2f --- /dev/null +++ b/frontend/src/lib/api/bookshelf.remote.ts @@ -0,0 +1,64 @@ +import { command, getRequestEvent, query } from '$app/server'; +import { bookshelfCreate, bookshelfQuerySchema, modifyBooksInShelf, type Bookshelf } from '$lib/schema/bookshelf'; +import { createQueryParams } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export const listBookshelves = query(bookshelfQuerySchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/shelves?${params.toString()}`); + + if (!response.ok) { + const message = await response.text(); + console.error('An unknown error occurred: ', message); + error(500, 'An unkown error occurred'); + } + + return await response.json(); +}); + +export const addBooksToShelf = command(modifyBooksInShelf, async ({ shelf_id, ...data }): Promise => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.post(`/shelves/${shelf_id}/books?${params.toString()}`, {}); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json() +}); + +export const removeBooksFromShelf = command(modifyBooksInShelf, async ({ shelf_id, ...data }): Promise => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.delete(`/shelves/${shelf_id}/books?${params.toString()}`); + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json() +}); + + +export const createBookshelf = command(bookshelfCreate, async (data) => { + const { locals } = getRequestEvent(); + + const response = await locals.api.post(`/shelves`, data) + + if (!response.ok) { + const message = await response.text(); + error(response.status, message); + } + + return await response.json() +}) diff --git a/frontend/src/lib/api/index.ts b/frontend/src/lib/api/index.ts new file mode 100644 index 0000000..7b9d134 --- /dev/null +++ b/frontend/src/lib/api/index.ts @@ -0,0 +1,7 @@ +export * from './auth.remote'; +export * from './author.remote'; +export * from './book.remote'; +export * from './bookshelf.remote'; +export * from './library.remote'; +export * from './publisher.remote'; +export * from './tag.remote'; diff --git a/frontend/src/lib/api/library.remote.ts b/frontend/src/lib/api/library.remote.ts new file mode 100644 index 0000000..eeb119e --- /dev/null +++ b/frontend/src/lib/api/library.remote.ts @@ -0,0 +1,30 @@ +import { form, getRequestEvent, query } from '$app/server'; +import { libraryCreateSchema, libraryQuerySchema } from '$lib/schema/library'; +import { createQueryParams } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export const listLibraries = query(libraryQuerySchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/libraries?${params.toString()}`); + + if (!response.ok) error(500, 'An unkown error occurred'); + + return await response.json(); +}); + +export const createLibrary = form(libraryCreateSchema, async (data) => { + const { locals } = getRequestEvent(); + + const response = await locals.api.post(`/libraries`, data); + + if (!response.ok) error(500, 'An unknown error occurred'); + + return await response.json(); +}); + +export const deleteLibrary = query('unchecked', async (data) => { + throw new Error('Not implemented'); +}); diff --git a/frontend/src/lib/api/publisher.remote.ts b/frontend/src/lib/api/publisher.remote.ts new file mode 100644 index 0000000..fb7ac33 --- /dev/null +++ b/frontend/src/lib/api/publisher.remote.ts @@ -0,0 +1,16 @@ +import { getRequestEvent, query } from '$app/server'; +import { publisherQuerySchema } from '$lib/schema/publisher'; +import { createQueryParams } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export const listPublishers = query(publisherQuerySchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/publishers?${params.toString()}`); + + if (!response.ok) error(500, 'An unkown error occurred'); + + return await response.json(); +}); diff --git a/frontend/src/lib/api/tag.remote.ts b/frontend/src/lib/api/tag.remote.ts new file mode 100644 index 0000000..c939c37 --- /dev/null +++ b/frontend/src/lib/api/tag.remote.ts @@ -0,0 +1,16 @@ +import { getRequestEvent, query } from '$app/server'; +import { tagQuerySchema } from '$lib/schema/tag'; +import { createQueryParams } from '$lib/utils'; +import { error } from '@sveltejs/kit'; + +export const listTags = query(tagQuerySchema, async (data) => { + const { locals } = getRequestEvent(); + + const params = createQueryParams(data); + + const response = await locals.api.get(`/tags?${params.toString()}`); + + if (!response.ok) error(500, 'An unkown error occurred'); + + return await response.json(); +}); diff --git a/frontend/src/lib/assets/favicon.svg b/frontend/src/lib/assets/favicon.svg new file mode 100644 index 0000000..0b427d4 --- /dev/null +++ b/frontend/src/lib/assets/favicon.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/lib/components/forms/book-delete.svelte b/frontend/src/lib/components/forms/book-delete.svelte new file mode 100644 index 0000000..db4200a --- /dev/null +++ b/frontend/src/lib/components/forms/book-delete.svelte @@ -0,0 +1,59 @@ + + + + + + {title} + + This will delete the book(s) from the database, and optionally delete the files from the + filesystem. + + + + + + + +
+ + Delete files from the filesystem +
+
+
+
+ + + + + + +
+
diff --git a/frontend/src/lib/components/forms/books-upload.svelte b/frontend/src/lib/components/forms/books-upload.svelte new file mode 100644 index 0000000..1d29d6e --- /dev/null +++ b/frontend/src/lib/components/forms/books-upload.svelte @@ -0,0 +1,161 @@ + + + + + {#if uploadBooks.pending} +
+ Uploading {uploadBooks.fields.files.value().length} files... + +
+ {:else} + + Upload Books + + +
{ + try { + await submit(); + + // Check if there are any validation issues + const issues = uploadBooks.fields.allIssues(); + if (issues && issues.length > 0) { + return; + } + + // Update library book count + const count = uploadBooks.result.total + libraryState.libraries.find(lib => uploadBooks.fields.library_id.value() == lib.id.toString())!.total += count + + // Reset the files field + uploadBooks.fields.files.set([]); + toast.success('Books successfully uploaded!'); + + if (navigateOnUpload) { + navigateToBooks(uploadBooks.result); + } + } catch (error) { + console.error('Failed to upload book: ', error); + toast.error('Failed to upload books'); + } + })} + bind:this={formEl} + enctype="multipart/form-data" + class="flex w-full flex-col gap-2 p-4" + > + + Select Library + + {#each libraryState.libraries as library} + + {library.name} + + {/each} + + + + +
+ {#each files as file, idx} +
+
+ {file.name} + {displaySize(file.size)} +
+ +
+ {/each} +
+ +
+
+ + Auto upload on file drop + +
+
+ + Navigate to book on upload +
+
+ + {/if} +
+
diff --git a/frontend/src/lib/components/forms/edit-book/edit-book.svelte b/frontend/src/lib/components/forms/edit-book/edit-book.svelte new file mode 100644 index 0000000..1b0a5e0 --- /dev/null +++ b/frontend/src/lib/components/forms/edit-book/edit-book.svelte @@ -0,0 +1,39 @@ + + + + {#if book} + + + + Metadata + Cover + Files + + + + + + + + + + + + + + + + + + + {/if} + diff --git a/frontend/src/lib/components/forms/edit-book/edit-cover.svelte b/frontend/src/lib/components/forms/edit-book/edit-cover.svelte new file mode 100644 index 0000000..db2578c --- /dev/null +++ b/frontend/src/lib/components/forms/edit-book/edit-cover.svelte @@ -0,0 +1,117 @@ + + +
{ + try { + await submit(); + form.reset(); + open = false; + toast.success('Updated book cover!'); + } catch (error) { + console.error('Failed to update book cover: ', error); + toast.error('Failed to update cover.'); + } + })} + enctype="multipart/form-data" + class="grid grid-cols-[1fr_2fr] gap-4 p-6" +> + + +
+ +
+ +
+ + +
+ {#if updateBookCover.fields.file.value()} +
+
+ {updateBookCover.fields.file.value().name} + {displaySize(updateBookCover.fields.file.value().size)} +
+ +
+ {/if} +
+ +
+ + Auto upload on file drop + +
+
+
diff --git a/frontend/src/lib/components/forms/edit-book/edit-files.svelte b/frontend/src/lib/components/forms/edit-book/edit-files.svelte new file mode 100644 index 0000000..e932bd8 --- /dev/null +++ b/frontend/src/lib/components/forms/edit-book/edit-files.svelte @@ -0,0 +1,98 @@ + + +
{ + try { + await submit(); + + // Check if there are any validation issues + const issues = uploadBookFiles.fields.allIssues(); + if (issues && issues.length > 0) { + return; + } + + // Reset the files field + uploadBookFiles.fields.files.set([]); + toast.success('Files successfully added!'); + } catch (error) { + console.error('Failed to upload files: ', error); + toast.error('Failed to upload files'); + } + })} + bind:this={formEl} + enctype="multipart/form-data" + class="flex w-full flex-col gap-2 p-4" +> + + + + +
+ {#each files as file, idx} +
+
+ {file.name} + {displaySize(file.size)} +
+ +
+ {/each} +
+ +
+ + Auto upload on file drop + +
+ diff --git a/frontend/src/lib/components/forms/edit-book/edit-metadata.svelte b/frontend/src/lib/components/forms/edit-book/edit-metadata.svelte new file mode 100644 index 0000000..7b935be --- /dev/null +++ b/frontend/src/lib/components/forms/edit-book/edit-metadata.svelte @@ -0,0 +1,282 @@ + + + +
{ + try { + await submit(); + + // Check if there are any validation issues + const issues = updateBookMetadata.fields.allIssues(); + if (issues && issues.length > 0) { + return; + } + + open = false; + book = book; + toast.success('Updated book metadata!'); + } catch (error) { + console.error('Error occurred updating book metadata: ', error); + toast.error('Failed to update book metadata.'); + } + })} + > + + + + + + + + + Title + + {#each updateBookMetadata.fields.title.issues() ?? [] as issue} + {issue.message} + {/each} + + + + + Subtitle + + {#each updateBookMetadata.fields.subtitle.issues() ?? [] as issue} + {issue.message} + {/each} + + +
+ + + Series + + {#each updateBookMetadata.fields.series.issues() ?? [] as issue} + {issue.message} + {/each} + + + + + Series position + + {#each updateBookMetadata.fields.series_position.issues() ?? [] as issue} + {issue.message} + {/each} + +
+ + + + Authors + + {#each authors as author} + + {/each} + {#each updateBookMetadata.fields.authors.issues() ?? [] as issue} + {issue.message} + {/each} + + + + + Tags + + {#each tags as tag} + + {/each} + {#each updateBookMetadata.fields.tags.issues() ?? [] as issue} + {issue.message} + {/each} + + + + + Description + diff --git a/frontend/src/lib/components/ui/toggle-group/index.ts b/frontend/src/lib/components/ui/toggle-group/index.ts new file mode 100644 index 0000000..73160fc --- /dev/null +++ b/frontend/src/lib/components/ui/toggle-group/index.ts @@ -0,0 +1,10 @@ +import Root from './toggle-group.svelte'; +import Item from './toggle-group-item.svelte'; + +export { + Root, + Item, + // + Root as ToggleGroup, + Item as ToggleGroupItem +}; diff --git a/frontend/src/lib/components/ui/toggle-group/toggle-group-item.svelte b/frontend/src/lib/components/ui/toggle-group/toggle-group-item.svelte new file mode 100644 index 0000000..7880968 --- /dev/null +++ b/frontend/src/lib/components/ui/toggle-group/toggle-group-item.svelte @@ -0,0 +1,34 @@ + + + diff --git a/frontend/src/lib/components/ui/toggle-group/toggle-group.svelte b/frontend/src/lib/components/ui/toggle-group/toggle-group.svelte new file mode 100644 index 0000000..f69f176 --- /dev/null +++ b/frontend/src/lib/components/ui/toggle-group/toggle-group.svelte @@ -0,0 +1,47 @@ + + + + + + diff --git a/frontend/src/lib/components/ui/toggle/index.ts b/frontend/src/lib/components/ui/toggle/index.ts new file mode 100644 index 0000000..0f18d3b --- /dev/null +++ b/frontend/src/lib/components/ui/toggle/index.ts @@ -0,0 +1,13 @@ +import Root from './toggle.svelte'; +export { + toggleVariants, + type ToggleSize, + type ToggleVariant, + type ToggleVariants +} from './toggle.svelte'; + +export { + Root, + // + Root as Toggle +}; diff --git a/frontend/src/lib/components/ui/toggle/toggle.svelte b/frontend/src/lib/components/ui/toggle/toggle.svelte new file mode 100644 index 0000000..491d775 --- /dev/null +++ b/frontend/src/lib/components/ui/toggle/toggle.svelte @@ -0,0 +1,52 @@ + + + + + diff --git a/frontend/src/lib/components/ui/tooltip/index.ts b/frontend/src/lib/components/ui/tooltip/index.ts new file mode 100644 index 0000000..313a7f0 --- /dev/null +++ b/frontend/src/lib/components/ui/tooltip/index.ts @@ -0,0 +1,21 @@ +import { Tooltip as TooltipPrimitive } from "bits-ui"; +import Trigger from "./tooltip-trigger.svelte"; +import Content from "./tooltip-content.svelte"; + +const Root = TooltipPrimitive.Root; +const Provider = TooltipPrimitive.Provider; +const Portal = TooltipPrimitive.Portal; + +export { + Root, + Trigger, + Content, + Provider, + Portal, + // + Root as Tooltip, + Content as TooltipContent, + Trigger as TooltipTrigger, + Provider as TooltipProvider, + Portal as TooltipPortal, +}; diff --git a/frontend/src/lib/components/ui/tooltip/tooltip-content.svelte b/frontend/src/lib/components/ui/tooltip/tooltip-content.svelte new file mode 100644 index 0000000..e495efe --- /dev/null +++ b/frontend/src/lib/components/ui/tooltip/tooltip-content.svelte @@ -0,0 +1,47 @@ + + + + + {@render children?.()} + + {#snippet child({ props })} +
+ {/snippet} +
+
+
diff --git a/frontend/src/lib/components/ui/tooltip/tooltip-trigger.svelte b/frontend/src/lib/components/ui/tooltip/tooltip-trigger.svelte new file mode 100644 index 0000000..1acdaa4 --- /dev/null +++ b/frontend/src/lib/components/ui/tooltip/tooltip-trigger.svelte @@ -0,0 +1,7 @@ + + + diff --git a/frontend/src/lib/components/view/batch-operations-toolbar.svelte b/frontend/src/lib/components/view/batch-operations-toolbar.svelte new file mode 100644 index 0000000..db93256 --- /dev/null +++ b/frontend/src/lib/components/view/batch-operations-toolbar.svelte @@ -0,0 +1,200 @@ + + + + + + { + await bookOps.markBooksAsComplete(selectionState.getSelectedIds()); + selectionState.deselectAll(); + }} + class={buttonVariants({ variant: 'ghost', size: 'icon' })} + > + + + +

Mark as finished

+
+
+
+ + + + + + {#snippet child({ props })} + + + + + + + Shelves + + {#each bookshelfState.getBookshelves(libraryState.activeLibrary!.id) as shelf} + book.lists.findIndex((sh) => sh.id === shelf.id) !== -1 + )} + onclick={async () => { + // Check if all books are in the shelf + const allBooksInShelf = selectedBooks.every((book) => + book.lists.find((sh) => sh.id === shelf.id) + ); + + if (allBooksInShelf) { + // Remove all books from the shelf + const bookIds = selectedBooks.map((book) => book.id); + await bookshelfState.removeBooksFromShelf(shelf.id, bookIds); + selectedBooks.forEach((book) => { + book.lists = book.lists.filter((sh) => sh.id !== shelf.id); + }); + } else { + // Add all books to the shelf + const bookIds = selectedBooks.map((book) => book.id); + await bookshelfState.addBooksToShelf(shelf.id, bookIds); + selectedBooks.forEach((book) => { + if (!book.lists.find((sh) => sh.id === shelf.id)) { + book.lists.push(shelf); + } + }); + } + selectionState.deselectAll(); + }} + > + {shelf.title} + + {/each} + + + createShelfDialogOpen = true} + class="text-muted-foreground "> + + New Shelf + + + + {/snippet} + + +

Add/Remove from shelf

+
+
+
+ + + + + { + bookOps.downloadBooks(selectionState.getSelectedIds()); + }} + class={buttonVariants({ variant: 'ghost', size: 'icon' })} + > + + + +

Download selected

+
+
+
+ + + + + { + bookOps.deleteDialogTitle = `Delete ${selectionState.getSelectedIds().length} books?`; + bookOps.deleteFn = async (deleteFiles: boolean) => { + await bookOps.deleteBooks(selectionState.getSelectedIds(), deleteFiles); + libraryState.activeLibrary!.total! -= selectedBooks.length + bookshelfState.deletedBooks(selectedBooks) + selectionState.deselectAll(); + }; + bookOps.deleteDialogOpen = true; + }} + class={buttonVariants({ variant: 'ghost', size: 'icon' })} + > + + + +

Delete selected

+
+
+
+ + + + + { + selectionState.selectAll(collectionState.books); + }} + class={buttonVariants({ variant: 'ghost', size: 'icon' })} + > + + + +

Select all

+
+
+
+ + + + + { + selectionState.deselectAll(); + }} + class={buttonVariants({ variant: 'ghost', size: 'icon' })} + > + + + +

Deselect all

+
+
+
+ + + { + + const bookshelf = await bookshelfState.addBookshelf(name, libraryState.activeLibrary!.id, selectionState.getSelectedIds()) + selectedBooks.forEach(book => book.lists.push(bookshelf)) + selectionState.deselectAll() + createShelfDialogOpen = false + }} +/> diff --git a/frontend/src/lib/components/view/book-browser.svelte b/frontend/src/lib/components/view/book-browser.svelte new file mode 100644 index 0000000..10c5205 --- /dev/null +++ b/frontend/src/lib/components/view/book-browser.svelte @@ -0,0 +1,154 @@ + + +
+ + +
diff --git a/frontend/src/lib/components/view/book-files-accordion.svelte b/frontend/src/lib/components/view/book-files-accordion.svelte new file mode 100644 index 0000000..26eb0ef --- /dev/null +++ b/frontend/src/lib/components/view/book-files-accordion.svelte @@ -0,0 +1,135 @@ + + + + + + +
+ Library Files + {book.files.length} +
+
+ + + + + Filename + Size + File type + Actions + + + + {#each book.files as file (file.id)} + + {file.filename} + {formatFileSize(file.size)} + {getFileType(file.filename)} + +
+ + {#if getFileType(file.filename) == 'EPUB' || getFileType(file.filename) == 'PDF'} + + + handleRead(file)} + > + + + +

Read

+
+
+
+ {/if} + + + + + handleDownload(file)} + > + + + +

Download

+
+
+
+ + + + + + + { + fileToDelete = file.id; + }} + > + + + +

Delete

+
+
+
+
+ + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the record from + the database and the file from the filesystem. + + + + Cancel + { + handleDeleteFile(fileToDelete); + fileDeleteDialogOpen = false; + fileToDelete = undefined; + }} + class="text-destructive-foreground bg-destructive hover:bg-destructive/90" + >Delete + + +
+
+
+
+ {/each} +
+
+
+
+
diff --git a/frontend/src/lib/components/view/book-grid.svelte b/frontend/src/lib/components/view/book-grid.svelte new file mode 100644 index 0000000..683abf8 --- /dev/null +++ b/frontend/src/lib/components/view/book-grid.svelte @@ -0,0 +1,102 @@ + + +
+ {#each books as book (book.id)} +
+
+ { + selectedState.toggleSelection(book); + }} + class="{selectedState.isSelected(book.id) + ? 'scale-110 text-yellow-300' + : 'scale-75 text-white'} transition-all hover:scale-110 hover:cursor-pointer hover:text-yellow-300" + /> +
+ {#if selectedState.isSelected(book.id)} +
+ +
+ {/if} + + {#if !selectedState.selectionModeActive} +
+ + + + + + + { + if (!book.progress?.completed) await bookOps.markBooksAsComplete([book.id]); + else await bookOps.markBooksAsIncomplete([book.id]); + }} + >{!book?.progress?.completed + ? 'Mark as finished' + : 'Mark as unfinished'} + { + bookOps.deleteDialogTitle = `Delete "${book.title}"?`; + bookOps.deleteFn = async (deleteFiles: boolean) => { + await bookOps.deleteBooks([book.id], deleteFiles); + libraryState.activeLibrary!.total!-- + bookshelfState.deletedBooks([book]) + }; + bookOps.deleteDialogOpen = true; + }} + > + Delete + + + + +
+
+ { + bookOps.bookToEdit = book; + bookOps.editDialogOpen = true; + }} + /> +
+ {/if} +
+ {/each} +
diff --git a/frontend/src/lib/components/view/book-image.svelte b/frontend/src/lib/components/view/book-image.svelte new file mode 100644 index 0000000..ff202c9 --- /dev/null +++ b/frontend/src/lib/components/view/book-image.svelte @@ -0,0 +1,9 @@ + + +book cover diff --git a/frontend/src/lib/components/view/book-list.svelte b/frontend/src/lib/components/view/book-list.svelte new file mode 100644 index 0000000..022f55f --- /dev/null +++ b/frontend/src/lib/components/view/book-list.svelte @@ -0,0 +1,100 @@ + + +{#if books.length > 0} +
+
+

{title}

+ {#if needsScroll} +
+ + +
+ {/if} +
+
+ {#each books as book (book.id)} +
+ +
+ {/each} +
+
+{/if} diff --git a/frontend/src/lib/components/view/book-table.svelte b/frontend/src/lib/components/view/book-table.svelte new file mode 100644 index 0000000..fb45508 --- /dev/null +++ b/frontend/src/lib/components/view/book-table.svelte @@ -0,0 +1,66 @@ + + + + + + + Cover + Title + Authors + Publisher + Published Date + Pages + Tags + Identifiers + + + + {#each books as book (book.id)} + + selectedState.toggleSelection(book)} + /> + + + + {book.title} + + {#each book.authors as author} + {author.name}   + {/each} + + {book.publisher} + {book.published_date} + {book.pages} + + {#each book.tags as tag} + {tag.name} + {/each} + + + {#each Object.entries(book.identifiers) as [name, value] (value)} + {name}   + {/each} + + + {/each} + + diff --git a/frontend/src/lib/components/view/book-thumbnail.svelte b/frontend/src/lib/components/view/book-thumbnail.svelte new file mode 100644 index 0000000..f5044b6 --- /dev/null +++ b/frontend/src/lib/components/view/book-thumbnail.svelte @@ -0,0 +1,65 @@ + + +
+ + + + + {#if book.progress?.progress && !selected && !darkened} + + {/if} + + + {book.title} + + +

+ {#each book.authors as author} + {author.name}   + {/each} +

+
diff --git a/frontend/src/lib/components/view/filter-button.svelte b/frontend/src/lib/components/view/filter-button.svelte new file mode 100644 index 0000000..a0485ea --- /dev/null +++ b/frontend/src/lib/components/view/filter-button.svelte @@ -0,0 +1,30 @@ + + + + + + + + {#if bookCollection.hasActiveFilters} +
+ {/if} +
+ +

Filter

+
+
+
diff --git a/frontend/src/lib/components/view/filter-sidebar.svelte b/frontend/src/lib/components/view/filter-sidebar.svelte new file mode 100644 index 0000000..370c376 --- /dev/null +++ b/frontend/src/lib/components/view/filter-sidebar.svelte @@ -0,0 +1,46 @@ + + + + + Filter Menu + + + + + + + + bookCollection.clearFilters()}> + + + Clear Filters + + + + + + + Hide Menu + + + + + diff --git a/frontend/src/lib/components/view/filters.svelte b/frontend/src/lib/components/view/filters.svelte new file mode 100644 index 0000000..83c9807 --- /dev/null +++ b/frontend/src/lib/components/view/filters.svelte @@ -0,0 +1,54 @@ + + +{#each bookCollection.filterOptions as filter, index (filter.name)} + + + + {#snippet child({ props })} + + {filter.name} + {#if bookCollection.filters[filter.value].length !== 0} +
+ {/if} + +
+ {/snippet} +
+ + + + {#each filter.items as item, index (item.id)} + bookCollection.toggleFilter(filter.value, item.id.toString())} + > + +
+
+ {item?.name || item?.title} +
+
+ {/each} +
+
+
+
+
+ +{/each} diff --git a/frontend/src/lib/components/view/sort-button.svelte b/frontend/src/lib/components/view/sort-button.svelte new file mode 100644 index 0000000..9ba9dfb --- /dev/null +++ b/frontend/src/lib/components/view/sort-button.svelte @@ -0,0 +1,56 @@ + + + + + + + {#snippet child({ props })} + + + {#if bookCollection.hasActiveSort} +
+ {/if} + +
+ + + {#each bookCollection.sortOptions as sortProp} + bookCollection.updateSort(sortProp.value)} + class={bookCollection.orderBy === sortProp.value ? 'bg-muted' : ''} + > +
+ {sortProp.name} + {#if bookCollection.orderBy === sortProp.value} + {#if bookCollection.sortOrder === 'asc'} + + {:else} + + {/if} + {/if} +
+
+ {/each} +
+
+
+ {/snippet} +
+ +

Sort

+
+
+
diff --git a/frontend/src/lib/components/view/view-toggle.svelte b/frontend/src/lib/components/view/view-toggle.svelte new file mode 100644 index 0000000..c54d372 --- /dev/null +++ b/frontend/src/lib/components/view/view-toggle.svelte @@ -0,0 +1,40 @@ + + + + + + + {#snippet child({ props })} + + + + {/snippet} + + +

Grid view

+
+
+
+ + + + + {#snippet child({ props })} + + + + {/snippet} + + +

List view

+
+
+
+
diff --git a/frontend/src/lib/hooks/is-mobile.svelte.ts b/frontend/src/lib/hooks/is-mobile.svelte.ts new file mode 100644 index 0000000..acbe8ef --- /dev/null +++ b/frontend/src/lib/hooks/is-mobile.svelte.ts @@ -0,0 +1,9 @@ +import { MediaQuery } from 'svelte/reactivity'; + +const DEFAULT_MOBILE_BREAKPOINT = 768; + +export class IsMobile extends MediaQuery { + constructor(breakpoint: number = DEFAULT_MOBILE_BREAKPOINT) { + super(`max-width: ${breakpoint - 1}px`); + } +} diff --git a/frontend/src/lib/index.ts b/frontend/src/lib/index.ts new file mode 100644 index 0000000..856f2b6 --- /dev/null +++ b/frontend/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/frontend/src/lib/schema/auth.ts b/frontend/src/lib/schema/auth.ts new file mode 100644 index 0000000..40dc882 --- /dev/null +++ b/frontend/src/lib/schema/auth.ts @@ -0,0 +1,30 @@ +import { z } from 'zod'; + +const emailSchema = z + .email('Please enter a valid email address') + .max(255, 'Email address cannot exceed 255 characters'); + +const usernameSchema = z.string().min(1, 'Email is required'); + +const basePasswordSchema = z.string().min(1, 'Password is required'); + +const strongPasswordSchema = z.string().min(8, 'Password must be at least 8 characters'); + +export const loginSchema = z.object({ + email: emailSchema, + password: basePasswordSchema +}); + +export const signupSchema = z + .object({ + email: emailSchema, + password: strongPasswordSchema, + confirmPassword: strongPasswordSchema + }) + .refine((data) => data.password === data.confirmPassword, { + message: 'Passwords must match', + path: ['confirmPassword'] + }); + +export type LoginSchema = typeof loginSchema; +export type SignupSchema = typeof signupSchema; diff --git a/frontend/src/lib/schema/author.ts b/frontend/src/lib/schema/author.ts new file mode 100644 index 0000000..fa8ece8 --- /dev/null +++ b/frontend/src/lib/schema/author.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +import type { components } from './openapi/schema'; +import { commonQuerySchema, stringArrayCoerce, stringCoerce } from './common'; + +export type Author = components['schemas']['AuthorRead']; + +export const authorQuerySchema = commonQuerySchema.extend({ + libraries: stringArrayCoerce, + ids: stringArrayCoerce +}); + +export type AuthorQuerySchema = typeof authorQuerySchema; diff --git a/frontend/src/lib/schema/book.ts b/frontend/src/lib/schema/book.ts new file mode 100644 index 0000000..a574d5e --- /dev/null +++ b/frontend/src/lib/schema/book.ts @@ -0,0 +1,103 @@ +import { number, string, z } from 'zod'; +import type { components } from './openapi/schema'; +import { arrayCoerce, commonQuerySchema, stringArrayCoerce, stringCoerce } from './common'; + +export type Book = components['schemas']['BookRead']; +export type BookFile = components['schemas']['FileMetadataRead']; +export type BookProgress = components['schemas']['BookProgressRead']; + +export const bookQuerySchema = commonQuerySchema.extend({ + libraries: stringArrayCoerce, + authors: stringArrayCoerce, + publishers: stringArrayCoerce, + tags: stringArrayCoerce, + shelves: stringArrayCoerce, + progress: arrayCoerce(z.enum(['unread', 'in_progress', 'read'])) + .nullable() + .optional(), + ids: stringArrayCoerce, + cacheTimestamp: z.number().optional() +}); + +const identifiersSchema = z + .string() + .transform((str, ctx) => { + try { + return JSON.parse(str); + } catch (e) { + ctx.addIssue({ + code: 'custom', + message: 'Must be a valid JSON string' + }); + return z.NEVER; + } + }) + .pipe( + z.record(z.string(), z.string()) // Key-value pairs, both strings + ); + +export const editBookMetadataSchema = z.object({ + book_id: z.string(), + title: string().min(1, 'Title cannot be empty'), + subtitle: string().optional(), + authors: z.array(z.string()).default([]), + tags: z.array(z.string()).default([]), + description: z.string().optional(), + publisher: z.string().optional(), + published_date: z + .string() + .optional() + .transform((val) => (val ? new Date(val) : undefined)), + series: z.string().optional(), + series_position: z.string().optional(), + identifiers: identifiersSchema, + edition: z.number().optional(), + pages: z.number().optional(), + language: z.string().optional() +}); + +export const bookCoverUpload = z.object({ + book_id: stringCoerce, + file: z.file() +}); + +export const booksUpload = z.object({ + library_id: stringCoerce, + files: z.array(z.file()).min(1, 'At least one file must be uploaded') +}); + +export const bookFilesUpload = z.object({ + book_id: stringCoerce, + files: z.array(z.file()).min(1, 'At least one file must be uploaded') +}); + +export const deleteBooksSchema = z.object({ + book_ids: stringArrayCoerce, // TODO Could also set minimum length of 1 + delete_files: z.boolean(), + library_id: stringCoerce +}); + +export const bookIdsSchema = z.object({ + book_ids: stringArrayCoerce // TODO Could also set minimum length of 1 +}); + +export const deleteBookFilesSchema = z.object({ + book_id: stringCoerce, + file_ids: stringArrayCoerce, + delete_files: z.boolean() +}); + +export const updateBookProgressSchema = z.object({ + book_ids: stringArrayCoerce, + progress: number().min(0).max(1), + completed: z.boolean().optional().default(false), + epub_loc: z.string().optional(), + pdf_loc: z.string().optional() +}); + +export type BookQuery = z.infer; +export type BookEditMetadata = z.infer; +export type DeleteBook = z.infer; +export type BookIds = z.infer; +export type DeleteBookFiles = z.infer; +export type UpdateBookProgress = z.infer; diff --git a/frontend/src/lib/schema/bookshelf.ts b/frontend/src/lib/schema/bookshelf.ts new file mode 100644 index 0000000..419a103 --- /dev/null +++ b/frontend/src/lib/schema/bookshelf.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; + +import type { components } from './openapi/schema'; +import { commonQuerySchema, stringArrayCoerce, stringCoerce } from './common'; + +export type Bookshelf = components['schemas']['ShelfRead']; + +export const bookshelfQuerySchema = commonQuerySchema.extend({ + libraries: stringArrayCoerce, + ids: stringArrayCoerce +}); + +export const modifyBooksInShelf = z.object({ + shelf_id: stringCoerce, + book_ids: stringArrayCoerce +}); + +export const bookshelfCreate = z.object({ + title: z.string().min(1, 'Must have a title'), + library_id: stringCoerce.optional(), + book_ids: stringArrayCoerce.optional() +}) + +export type BookshelfQuerySchema = typeof bookshelfQuerySchema; +export type ModifyBooksInShelf = typeof modifyBooksInShelf; diff --git a/frontend/src/lib/schema/common.ts b/frontend/src/lib/schema/common.ts new file mode 100644 index 0000000..e96a8ea --- /dev/null +++ b/frontend/src/lib/schema/common.ts @@ -0,0 +1,45 @@ +import { z } from 'zod'; + +export interface PaginatedResponse { + items: T[]; + /** @description Total number of items. */ + total: number; + /** @description Offset from the beginning of the query. */ + offset: number; + /** @description Maximal number of items to send. */ + limit: number; +} + +// Generic helper to coerce single values into arrays +export const arrayCoerce = (schema: T) => + z + .union([z.array(schema.or(z.any())), schema.or(z.any())]) + .transform((val) => (Array.isArray(val) ? val : [val])) + .pipe(z.array(schema)); + +// Reusable schemas for coercing strings from strings or numbers +export const stringCoerce = z.union([z.string(), z.number()]).transform(String); +export const stringArrayCoerce = arrayCoerce(stringCoerce).nullable().optional(); + +// Search fields +export const searchQuerySchema = z.object({ + searchString: z.string().nullable().optional(), + searchIgnoreCase: z.boolean().nullable().optional() +}); + +// Pagination fields +export const paginationQuerySchema = z.object({ + currentPage: z.coerce.number().optional(), + pageSize: z.coerce.number().optional() +}); + +// Ordering fields +export const orderQuerySchema = z.object({ + orderBy: z.string().nullable().optional(), + sortOrder: z.string().nullable().optional() +}); + +// Combined schema +export const commonQuerySchema = paginationQuerySchema + .extend(searchQuerySchema.shape) + .extend(orderQuerySchema.shape); diff --git a/frontend/src/lib/schema/filter.ts b/frontend/src/lib/schema/filter.ts new file mode 100644 index 0000000..7ea975d --- /dev/null +++ b/frontend/src/lib/schema/filter.ts @@ -0,0 +1,27 @@ +import type { Author } from './author'; +import type { Bookshelf } from './bookshelf'; +import type { PaginatedResponse } from './common'; +import type { Publisher } from './publisher'; +import type { Tag } from './tag'; + +export interface FilterOption { + value: string; + name: string; + items: { + name?: string; + title?: string; + id: number | string; + }[]; +} + +export interface SortOption { + value: string; + name: string; +} + +export interface DynamicFilterData { + authors: PaginatedResponse; + bookshelves: PaginatedResponse; + publishers: PaginatedResponse; + tags: PaginatedResponse; +} diff --git a/frontend/src/lib/schema/index.ts b/frontend/src/lib/schema/index.ts new file mode 100644 index 0000000..0f946b7 --- /dev/null +++ b/frontend/src/lib/schema/index.ts @@ -0,0 +1,9 @@ +export * from './auth'; +export * from './author'; +export * from './book'; +export * from './bookshelf'; +export * from './common'; +export * from './library'; +export * from './publisher'; +export * from './tag'; +export * from './filter'; diff --git a/frontend/src/lib/schema/library.ts b/frontend/src/lib/schema/library.ts new file mode 100644 index 0000000..62e7a61 --- /dev/null +++ b/frontend/src/lib/schema/library.ts @@ -0,0 +1,20 @@ +import { z } from 'zod'; + +import type { components } from './openapi/schema'; +import { paginationQuerySchema, stringArrayCoerce } from './common'; + +export type Library = components['schemas']['LibraryRead']; + +export const libraryQuerySchema = paginationQuerySchema.extend({ + ids: stringArrayCoerce +}); + +export const libraryCreateSchema = z.object({ + name: z.string().min(1, 'Library must have a name'), + description: z.string().optional(), + root_path: z.string().min(1, 'Must specify a root path'), + path_template: z.string().optional().default('/{author}/{title}') +}); + +export type LibraryQuerySchema = typeof libraryQuerySchema; +export type LibraryCreateSchema = typeof libraryCreateSchema; diff --git a/frontend/src/lib/schema/openapi/schema.d.ts b/frontend/src/lib/schema/openapi/schema.d.ts new file mode 100644 index 0000000..a21b97c --- /dev/null +++ b/frontend/src/lib/schema/openapi/schema.d.ts @@ -0,0 +1,1689 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/books/{book_id}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** AddBookFiles */ + post: operations["BooksBookIdFilesAddBookFiles"]; + /** DeleteBookFiles */ + delete: operations["BooksBookIdFilesDeleteBookFiles"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListBooks */ + get: operations["BooksListBooks"]; + put?: never; + /** CreateBook */ + post: operations["BooksCreateBook"]; + /** DeleteBooks */ + delete: operations["BooksDeleteBooks"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/fromFiles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** CreateBooksWithoutMetadata */ + post: operations["BooksFromfilesCreateBooksWithoutMetadata"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/{book_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** GetBookById */ + get: operations["BooksBookIdGetBookById"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + /** UpdateBookMetadata */ + patch: operations["BooksBookIdUpdateBookMetadata"]; + trace?: never; + }; + "/books/download/{book_id}/{file_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** GetFile */ + get: operations["BooksDownloadBookIdFileIdGetFile"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/download": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** GetFiles */ + get: operations["BooksDownloadGetFiles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/progress": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** SetBookProgressBatch */ + post: operations["BooksProgressSetBookProgressBatch"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/{book_id}/cover": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** UpdateCover */ + put: operations["BooksBookIdCoverUpdateCover"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/books/progress/{book_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** UpdateProgress */ + post: operations["BooksProgressBookIdUpdateProgress"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/libraries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListLibraries */ + get: operations["LibrariesListLibraries"]; + put?: never; + /** CreateLibrary */ + post: operations["LibrariesCreateLibrary"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/access/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** GetUserInfo */ + get: operations["AccessMeGetUserInfo"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/access/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Login */ + post: operations["AccessLoginLogin"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/access/signup": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Register */ + post: operations["AccessSignupRegister"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/shelves/{shelf_id}/books": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** AddBooksToShelf */ + post: operations["ShelvesShelfIdBooksAddBooksToShelf"]; + /** RemoveBooksFromShelf */ + delete: operations["ShelvesShelfIdBooksRemoveBooksFromShelf"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/shelves": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListShelves */ + get: operations["ShelvesListShelves"]; + put?: never; + /** CreateShelf */ + post: operations["ShelvesCreateShelf"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/shelves/{shelf_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** DeleteShelf */ + delete: operations["ShelvesShelfIdDeleteShelf"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/authors": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListAuthors */ + get: operations["AuthorsListAuthors"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/publishers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListPublishers */ + get: operations["PublishersListPublishers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/tags": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** ListTags */ + get: operations["TagsListTags"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Index */ + get: operations["Index"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/healthcheck": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Healthcheck */ + get: operations["HealthcheckHealthcheck"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + /** AuthorRead */ + AuthorRead: { + id: number; + name: string; + }; + /** BookCreate */ + BookCreate: { + library_id: number; + title?: string | null; + subtitle?: string | null; + description?: string | null; + authors?: string[]; + tags?: string[]; + edition?: number | null; + publisher?: string | null; + published_date?: string | null; + identifiers?: { + [key: string]: string; + } | null; + language?: string | null; + pages?: number | null; + series?: string | null; + series_position?: string | null; + cover_image?: string | null; + files?: string[]; + }; + /** BookMetadataUpdate */ + BookMetadataUpdate: { + title?: string | null; + subtitle?: string | null; + description?: string | null; + authors?: string[]; + tags?: string[]; + edition?: number | null; + publisher?: string | null; + published_date?: string | null; + /** @default {} */ + identifiers: { + [key: string]: string; + } | null; + language?: string | null; + pages?: number | null; + series?: string | null; + series_position?: string | null; + }; + /** BookProgressCreate */ + BookProgressCreate: { + progress: number; + epub_loc?: string | null; + pdf_loc?: number | null; + completed?: boolean | null; + }; + /** BookProgressRead */ + BookProgressRead: { + progress: number; + epub_loc?: string | null; + pdf_loc?: number | null; + /** @default false */ + completed: boolean | null; + }; + /** BookRead */ + BookRead: { + id: number; + library_id: number; + title: string; + subtitle?: string | null; + description?: string | null; + cover_image?: string | null; + authors: components["schemas"]["AuthorRead"][]; + edition?: number | null; + publisher?: components["schemas"]["PublisherRead"] | null; + published_date?: string | null; + identifiers: { + [key: string]: string; + }; + language?: string | null; + pages?: number | null; + tags: components["schemas"]["TagRead"][]; + lists: components["schemas"]["ShelfRead"][]; + series?: components["schemas"]["BookSeriesRead"] | null; + series_position?: string | null; + files: components["schemas"]["FileMetadataRead"][]; + progress?: components["schemas"]["BookProgressRead"] | null; + }; + /** BookSeriesRead */ + BookSeriesRead: { + id: number; + title: string; + }; + /** BooksCreateFromFiles */ + BooksCreateFromFiles: { + files?: string[]; + }; + /** FileMetadataRead */ + FileMetadataRead: { + id: number; + path: string; + hash: string; + size: number; + content_type: string; + readonly filename: string; + }; + /** LibraryCreate */ + LibraryCreate: { + name: string; + root_path: string; + /** @default {author}/{title} */ + path_template: string | null; + description?: string | null; + /** @default false */ + read_only: boolean; + }; + /** LibraryRead */ + LibraryRead: { + id: number; + name: string; + root_path: string; + path_template: string; + description?: string | null; + read_only: boolean; + total?: number | null; + }; + /** OAuth2Login */ + OAuth2Login: { + access_token: string; + token_type: string; + refresh_token?: string | null; + expires_in?: number | null; + }; + /** PublisherRead */ + PublisherRead: { + id: number; + name: string; + }; + /** ShelfCreate */ + ShelfCreate: { + title: string; + library_id?: number | null; + /** @default [] */ + book_ids: number[]; + }; + /** ShelfRead */ + ShelfRead: { + id: number; + title: string; + library_id?: number | null; + total?: number | null; + }; + /** TagRead */ + TagRead: { + id: number; + name: string; + }; + /** UserCreate */ + UserCreate: { + email: string; + password: string; + }; + /** UserLogin */ + UserLogin: { + email: string; + password: string; + }; + /** UserRead */ + UserRead: { + email: string; + }; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + BooksBookIdFilesAddBookFiles: { + parameters: { + query?: { + library_id?: number | null; + }; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": { + files?: string[]; + }; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BookRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksBookIdFilesDeleteBookFiles: { + parameters: { + query: { + library_id?: number | null; + file_ids: number[]; + delete_files?: boolean; + }; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, nothing follows */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksListBooks: { + parameters: { + query?: { + libraries?: number[] | null; + authors?: number[] | null; + publishers?: number[] | null; + tags?: number[] | null; + shelves?: number[] | null; + progress?: string[] | null; + ids?: string[] | null; + searchString?: string | null; + searchIgnoreCase?: boolean | null; + currentPage?: number; + pageSize?: number; + orderBy?: string | null; + sortOrder?: string | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["BookRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksCreateBook: { + parameters: { + query?: { + library_id?: number | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["BookCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BookRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksDeleteBooks: { + parameters: { + query: { + library_id?: number | null; + book_ids: number[]; + delete_files?: boolean; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, nothing follows */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksFromfilesCreateBooksWithoutMetadata: { + parameters: { + query?: { + library_id?: number | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": components["schemas"]["BooksCreateFromFiles"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["BookRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksBookIdGetBookById: { + parameters: { + query?: never; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BookRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksBookIdUpdateBookMetadata: { + parameters: { + query?: { + library_id?: number | null; + }; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["BookMetadataUpdate"]; + }; + }; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BookRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksDownloadBookIdFileIdGetFile: { + parameters: { + query?: never; + header?: never; + path: { + book_id: number; + file_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description File Download */ + 200: { + headers: { + /** @description File size in bytes */ + "content-length"?: string; + /** @description Last modified data-time in RFC 2822 format */ + "last-modified"?: string; + /** @description Entity tag */ + etag?: string; + [name: string]: unknown; + }; + content: { + "": string; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksDownloadGetFiles: { + parameters: { + query: { + book_ids: number[]; + library_id: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Stream Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": unknown; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksProgressSetBookProgressBatch: { + parameters: { + query: { + book_ids: number[]; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["BookProgressCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksBookIdCoverUpdateCover: { + parameters: { + query?: { + library_id?: number | null; + }; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "multipart/form-data": { + /** Format: binary */ + file?: string; + }; + }; + }; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["BookRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + BooksProgressBookIdUpdateProgress: { + parameters: { + query?: never; + header?: never; + path: { + book_id: number; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["BookProgressCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + LibrariesListLibraries: { + parameters: { + query?: { + ids?: string[] | null; + currentPage?: number; + pageSize?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["LibraryRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + LibrariesCreateLibrary: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["LibraryCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["LibraryRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + AccessMeGetUserInfo: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRead"]; + }; + }; + }; + }; + AccessLoginLogin: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/x-www-form-urlencoded": components["schemas"]["UserLogin"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["OAuth2Login"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + AccessSignupRegister: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["UserCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["UserRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + ShelvesShelfIdBooksAddBooksToShelf: { + parameters: { + query: { + book_ids: number[]; + }; + header?: never; + path: { + shelf_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ShelfRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + ShelvesShelfIdBooksRemoveBooksFromShelf: { + parameters: { + query: { + book_ids: number[]; + }; + header?: never; + path: { + shelf_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ShelfRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + ShelvesListShelves: { + parameters: { + query?: { + libraries?: number[] | null; + ids?: string[] | null; + searchString?: string | null; + searchIgnoreCase?: boolean | null; + currentPage?: number; + pageSize?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["ShelfRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + ShelvesCreateShelf: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ShelfCreate"]; + }; + }; + responses: { + /** @description Document created, URL follows */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ShelfRead"]; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + ShelvesShelfIdDeleteShelf: { + parameters: { + query?: never; + header?: never; + path: { + shelf_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, nothing follows */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + AuthorsListAuthors: { + parameters: { + query?: { + libraries?: number[] | null; + ids?: string[] | null; + searchString?: string | null; + searchIgnoreCase?: boolean | null; + currentPage?: number; + pageSize?: number; + orderBy?: string | null; + sortOrder?: "asc" | "desc" | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["AuthorRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + PublishersListPublishers: { + parameters: { + query?: { + libraries?: number[] | null; + ids?: string[] | null; + searchString?: string | null; + searchIgnoreCase?: boolean | null; + currentPage?: number; + pageSize?: number; + orderBy?: string | null; + sortOrder?: "asc" | "desc" | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["PublisherRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + TagsListTags: { + parameters: { + query?: { + libraries?: number[] | null; + ids?: string[] | null; + searchString?: string | null; + searchIgnoreCase?: boolean | null; + currentPage?: number; + pageSize?: number; + orderBy?: string | null; + sortOrder?: "asc" | "desc" | null; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + items?: components["schemas"]["TagRead"][]; + /** @description Maximal number of items to send. */ + limit?: number; + /** @description Offset from the beginning of the query. */ + offset?: number; + /** @description Total number of items. */ + total?: number; + }; + }; + }; + /** @description Bad request syntax or unsupported method */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status_code: number; + detail: string; + extra?: null | { + [key: string]: unknown; + } | unknown[]; + }; + }; + }; + }; + }; + Index: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/plain": string; + }; + }; + }; + }; + HealthcheckHealthcheck: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Request fulfilled, document follows */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + [key: string]: string; + }; + }; + }; + }; + }; +} diff --git a/frontend/src/lib/schema/publisher.ts b/frontend/src/lib/schema/publisher.ts new file mode 100644 index 0000000..87666d4 --- /dev/null +++ b/frontend/src/lib/schema/publisher.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +import type { components } from './openapi/schema'; +import { commonQuerySchema, stringArrayCoerce } from './common'; + +export type Publisher = components['schemas']['PublisherRead']; + +export const publisherQuerySchema = commonQuerySchema.extend({ + libraries: stringArrayCoerce, + ids: stringArrayCoerce +}); + +export type PublisherQuerySchema = typeof publisherQuerySchema; diff --git a/frontend/src/lib/schema/tag.ts b/frontend/src/lib/schema/tag.ts new file mode 100644 index 0000000..8908432 --- /dev/null +++ b/frontend/src/lib/schema/tag.ts @@ -0,0 +1,13 @@ +import { z } from 'zod'; + +import type { components } from './openapi/schema'; +import { commonQuerySchema, stringArrayCoerce } from './common'; + +export type Tag = components['schemas']['TagRead']; + +export const tagQuerySchema = commonQuerySchema.extend({ + libraries: stringArrayCoerce, + ids: stringArrayCoerce +}); + +export type TagQuerySchema = typeof tagQuerySchema; diff --git a/frontend/src/lib/server/api.ts b/frontend/src/lib/server/api.ts new file mode 100644 index 0000000..2f7adfa --- /dev/null +++ b/frontend/src/lib/server/api.ts @@ -0,0 +1,83 @@ +import { BACKEND_API_URL } from '$lib/server/config'; + +export class ApiClient { + private token: string; + + constructor(token: string) { + this.token = token; + } + + private async request(endpoint: string, options: RequestInit = {}): Promise { + return fetch(`${BACKEND_API_URL}${endpoint}`, { + ...options, + headers: { + Authorization: `Bearer ${this.token}`, + ...options.headers + } + }); + } + + async get(endpoint: string): Promise { + return this.request(endpoint); + } + + async post(endpoint: string, data: any): Promise { + return this.request(endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + } + + async postForm(endpoint: string, data: Record): Promise { + return this.request(endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: new URLSearchParams(data).toString() + }); + } + + async postMultipart(endpoint: string, formData: FormData): Promise { + return this.request(endpoint, { + method: 'POST', + body: formData + }); + } + + async put(endpoint: string, data: any): Promise { + return this.request(endpoint, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + } + + async putMultipart(endpoint: string, formData: FormData) { + return this.request(endpoint, { + method: 'PUT', + body: formData + }); + } + + async delete(endpoint: string): Promise { + return this.request(endpoint, { + method: 'DELETE' + }); + } + + async patch(endpoint: string, data: any): Promise { + return this.request(endpoint, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + } +} diff --git a/frontend/src/lib/server/auth.ts b/frontend/src/lib/server/auth.ts new file mode 100644 index 0000000..224bb85 --- /dev/null +++ b/frontend/src/lib/server/auth.ts @@ -0,0 +1,18 @@ +import type { ApiClient } from './api'; + +export interface User { + email: string; +} + +export async function validateToken(api: ApiClient): Promise { + try { + const response = await api.get('/access/me'); + + if (!response.ok) return null; + + return await response.json(); + } catch (error) { + console.error('Token validation failed:', error); + return null; + } +} diff --git a/frontend/src/lib/server/config.ts b/frontend/src/lib/server/config.ts new file mode 100644 index 0000000..2d31b62 --- /dev/null +++ b/frontend/src/lib/server/config.ts @@ -0,0 +1 @@ +export const BACKEND_API_URL = import.meta.env.VITE_BACKEND_API_URL || 'http://localhost:8000'; diff --git a/frontend/src/lib/state/bookCollection.svelte.ts b/frontend/src/lib/state/bookCollection.svelte.ts new file mode 100644 index 0000000..8064db6 --- /dev/null +++ b/frontend/src/lib/state/bookCollection.svelte.ts @@ -0,0 +1,229 @@ +import { getContext, setContext } from 'svelte'; +import { goto, pushState, replaceState } from '$app/navigation'; +import type { Book, DynamicFilterData, FilterOption, PaginatedResponse } from '$lib/schema'; +import { page } from '$app/state'; +import { BookOperationsState } from './bookOperations.svelte'; + +export class BookCollectionState { + public sortOrder = $state(''); + public orderBy = $state(''); + public filters = $state>({}); + + readonly hasActiveSort = $derived(this.orderBy !== 'title' || this.sortOrder !== 'asc'); + readonly hasActiveFilters = $derived(Object.values(this.filters).some((arr) => arr.length > 0)); + + public books = $state([]); + public moreBooks = $state(false); + private currentBookPage = $state(1); + public loading = $state(false); + + public filterOptions: FilterOption[] = $state([]); + + private ops: BookOperationsState; + + readonly sortOptions = [ + { + value: 'title', + name: 'Title' + }, + { + value: 'created_at', + name: 'Date Added' + }, + { + value: 'published_date', + name: 'Date Published' + }, + { + value: 'pages', + name: 'Pages' + }, + { + value: 'last_accessed', + name: 'Last Accessed' + } + ]; + + constructor( + ops: BookOperationsState, + books: PaginatedResponse, + filterData: DynamicFilterData + ) { + this.ops = ops; + this.books = books.items; + this.moreBooks = books.total > books.items.length; + this.filterOptions = this.buildFilterOptions(filterData); + + // Determine sort order and direction based on page data + this.orderBy = page.url.searchParams.get('orderBy') || 'title'; + this.sortOrder = page.url.searchParams.get('sortOrder') || 'asc'; + + // Construct initial filters based on the page data + this.filters = { + authors: page.url.searchParams.getAll('authors'), + publishers: page.url.searchParams.getAll('publishers'), + progress: page.url.searchParams.getAll('progress'), + tags: page.url.searchParams.getAll('tags'), + shelves: page.url.searchParams.getAll('shelves') + }; + } + + updateSort(sortValue: string) { + if (sortValue === this.orderBy) { + this.sortOrder = this.sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + this.orderBy = sortValue; + } + this.updateSearchParams(); + } + + toggleFilter(filter: string, value: string) { + if (!this.filters[filter]) { + this.filters[filter] = []; + } + + const index = this.filters[filter].indexOf(value); + if (index > -1) { + this.filters[filter].splice(index, 1); + } else { + this.filters[filter].push(value); + } + this.updateSearchParams(); + } + + updateSearchParams() { + // Update URL + const url = new URL(window.location.href); + + Object.entries(this.filters).forEach(([filter, values]) => { + url.searchParams.delete(filter); + values.forEach((val) => url.searchParams.append(filter, val.toString())); + }); + + url.searchParams.set('orderBy', this.orderBy); + url.searchParams.set('sortOrder', this.sortOrder); + + // pushState(url.toString(), {}) + goto(url.toString()); + + this.loadNewBooks(); + } + + async loadNewBooks() { + this.loading = true; + + const result = await this.ops.listBooks({ + currentPage: 1, + pageSize: 50, + sortOrder: this.sortOrder, + orderBy: this.orderBy, + ...this.filters + }); + + this.books = [...result.items]; + this.currentBookPage = 1; + this.loading = false; + } + + async loadMoreBooks() { + const result = await this.ops.listBooks({ + currentPage: this.currentBookPage + 1, + pageSize: 50, + sortOrder: this.sortOrder, + orderBy: this.orderBy, + ...this.filters + }); + + this.books = [...this.books, ...result.items]; + this.moreBooks = result.total > this.books.length; + this.currentBookPage++; + } + + updateBooks(books: PaginatedResponse) { + this.books = books.items; + this.moreBooks = books.total > books.items.length; + } + + resetState(books: PaginatedResponse, filterData: DynamicFilterData) { + this.books = books.items; + this.moreBooks = books.total > books.items.length; + this.filterOptions = this.buildFilterOptions(filterData); + + const urlParams = new URLSearchParams(window.location.search); + + // Re-read sort and filter state from URL + this.orderBy = urlParams.get('orderBy') || 'title'; + this.sortOrder = urlParams.get('sortOrder') || 'asc'; + + this.filters = { + authors: urlParams.getAll('authors'), + publishers: urlParams.getAll('publishers'), + progress: urlParams.getAll('progress'), + tags: urlParams.getAll('tags'), + shelves: urlParams.getAll('shelves') + }; + } + + buildFilterOptions(data: DynamicFilterData): FilterOption[] { + return [ + { + value: 'shelves', + name: 'Bookshelves', + items: data.bookshelves.items + }, + { + value: 'authors', + name: 'Authors', + items: data.authors.items + }, + { + value: 'tags', + name: 'Tags', + items: data.tags.items + }, + { + value: 'publishers', + name: 'Publishers', + items: data.publishers.items + }, + { + value: 'progress', + name: 'Progress', + items: [ + { id: 'read', name: 'Read' }, + { id: 'in_progress', name: 'In Progress' }, + { id: 'unread', name: 'Not Started' } + ] + } + ]; + } + + updateFilterOptions( + filterOptions: { value: string; name: string; items: { name: string; id: number | string }[] }[] + ) { + this.filterOptions = filterOptions; + } + + clearFilters() { + Object.values(this.filters).forEach((val) => (val.length = 0)); + this.updateSearchParams(); + } + + isFilterSelected(filter: string, value: string) { + return this.filters[filter]?.includes(value) || false; + } +} + +const BOOK_COLLECTION_KEY = Symbol('BOOK_COLLECTION'); + +export function setBookCollectionState( + ops: BookOperationsState, + books: PaginatedResponse, + filterData: DynamicFilterData +) { + return setContext(BOOK_COLLECTION_KEY, new BookCollectionState(ops, books, filterData)); +} + +export function getBookCollectionState() { + return getContext>(BOOK_COLLECTION_KEY); +} diff --git a/frontend/src/lib/state/bookOperations.svelte.ts b/frontend/src/lib/state/bookOperations.svelte.ts new file mode 100644 index 0000000..0be2fc2 --- /dev/null +++ b/frontend/src/lib/state/bookOperations.svelte.ts @@ -0,0 +1,178 @@ +import { invalidate } from '$app/navigation'; +import { page } from '$app/state'; +import { + deleteBookFiles, + deleteBooks, + listBooks, + updateBookProgress +} from '$lib/api'; +import { + type Book, + type UpdateBookProgress, + type BookQuery, + type PaginatedResponse, +} from '$lib/schema'; +import { getContext, setContext } from 'svelte'; +import { toast } from 'svelte-sonner'; + +export class BookOperationsState { + public libraryId = $state(''); + + // Delete dialog related state + deleteDialogOpen = $state(false); + deleteDialogTitle = $state('Delete books?'); + deleteFn = $state((deleteFiles: boolean) => {}); + + // Edit dialog related state + editDialogOpen = $state(false); + bookToEdit = $state(); + + // Upload dialog related state + uploadDialogOpen = $state(false); + + constructor(libraryId: string | number) { + this.libraryId = libraryId.toString(); + } + + async listBooks(queryData: BookQuery): Promise> { + const cleanParams = Object.fromEntries( + Object.entries(queryData).filter(([_, value]) => { + // Remove empty values + if (value === undefined || value === null) return false; + if (Array.isArray(value) && value.length === 0) return false; + if (value === '') return false; + return true; + }) + ); + + return await listBooks({ + // cacheTimestamp: this.cacheTimestamp, + libraries: [this.libraryId], + ...cleanParams + }); + } + + async deleteBooks(bookIds: string[] | number[], deleteFiles: boolean, reload: boolean = true) { + try { + await deleteBooks({ + book_ids: bookIds, + delete_files: deleteFiles, + library_id: this.libraryId + }); + + if (bookIds.length > 1) toast.success(`Deleted ${bookIds.length} books!`); + else toast.success(`Book deleted!`); + + this.deleteDialogOpen = false; + + // Reload the page after deleting a book to get fresh data + if (reload) await this.reload(); + } catch (error) { + toast.error('Failed to delete.'); + console.error('Failed to delete book(s): ', error); + } + } + + async deleteBookFiles(bookId: number, fileIds: number[], deleteFiles: boolean) { + try { + await deleteBookFiles({ + book_id: bookId, + file_ids: fileIds, + delete_files: deleteFiles + }); + + await invalidate('app:books'); + + if (fileIds.length > 1) toast.success(`Deleted ${fileIds.length} files!`); + else toast.success(`Deleted file!`); + } catch (error) { + toast.error('Failed to delete file(s)'); + console.error('Failed to delete book files: ', error); + } + } + + async updateBookProgress(bookIds: string[] | number[], progressRecord: UpdateBookProgress) { + await updateBookProgress({ + book_ids: bookIds, + ...progressRecord + }); + } + + async markBooksAsComplete(bookIds: string[] | number[]) { + try { + await this.updateBookProgress(bookIds, { + progress: 1, + completed: true + }); + + if (bookIds.length > 1) toast.success('Book marked as complete!'); + else toast.success(`${bookIds.length} books marked as complete!`); + + // Get fresh data + await this.reload(); + } catch (error) { + toast.error('Failed to mark books as complete.'); + console.error('Mark as complete operation failed: ', error); + } + } + + async markBooksAsIncomplete(bookIds: number[]) { + try { + await this.updateBookProgress(bookIds, { + progress: 0, + completed: false + }); + + if (bookIds.length > 1) toast.success('Book progress reset!'); + else toast.success(`Reset progress for ${bookIds.length} books!`); + + // get fresh data + await this.reload(); + } catch (error) { + toast.error('Failed to reset progress.'); + console.error('Mark as incomplete operation failed: ', error); + } + } + + async downloadBooks(bookIds: string[] | number[], filename?: string) { + // Construct the download URL + const downloadUrl = new URL(`/api/books/download`, page.url.origin); + downloadUrl.searchParams.set('library_id', this.libraryId); + bookIds.forEach((id) => { + downloadUrl.searchParams.set('book_ids', id.toString()); + }); + + this.download(downloadUrl, filename || 'download.zip'); + } + + async downloadBookFile(bookId: number, fileId: number, filename: string) { + // Construct the download URL + const downloadUrl = new URL(`/api/books/download/${bookId}/${fileId}`, page.url.origin); + this.download(downloadUrl, filename); + } + + private download(downloadUrl: URL, filename: string) { + // Create a download anchor element, click it, then remove it + const link = document.createElement('a'); + link.download = filename; + link.href = downloadUrl.href; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + + private async reload() { + await invalidate('app:books'); + } +} + +const BOOK_OPS_KEY = Symbol('BOOK_OPERATIONS'); + +export function setBookOperationsState(libraryId: string | number) { + return setContext(BOOK_OPS_KEY, new BookOperationsState(libraryId)); +} + +export function getBookOperationsState() { + return getContext>(BOOK_OPS_KEY); +} diff --git a/frontend/src/lib/state/bookSelection.svelte.ts b/frontend/src/lib/state/bookSelection.svelte.ts new file mode 100644 index 0000000..9e800d1 --- /dev/null +++ b/frontend/src/lib/state/bookSelection.svelte.ts @@ -0,0 +1,55 @@ +import type { Book } from '$lib/schema'; +import { getContext, setContext } from 'svelte'; +import { SvelteMap } from 'svelte/reactivity'; + +export class BookSelectionState { + private selectedBooks = new SvelteMap(); + readonly selectionModeActive = $derived(this.selectedBooks.size !== 0); + + toggleSelection(book: Book) { + const bookId = book.id.toString() + if (this.selectedBooks.has(bookId)) + this.selectedBooks.delete(bookId); + + else + this.selectedBooks.set(bookId, book); + } + + isSelected(id: number | string): boolean { + return this.selectedBooks.has(id.toString()); + } + + getSelectedBooks(): Book[] { + return Array.from(this.selectedBooks.values()) + } + + getSelectedIds(): string[] { + return Array.from(this.selectedBooks.keys()) + } + + numSelected() { + return this.selectedBooks.size; + } + + selectAll(books: Book[]) { + books.forEach((book) => { + const bookId = book.id.toString() + if (!this.selectedBooks.has(bookId)) + this.selectedBooks.set(bookId, book) + }); + } + + deselectAll() { + this.selectedBooks.clear(); + } +} + +const BOOK_SELECTION_KEY = Symbol('BOOK_SELECTION'); + +export function setBookSelectionState() { + return setContext(BOOK_SELECTION_KEY, new BookSelectionState()); +} + +export function getBookSelectionState() { + return getContext>(BOOK_SELECTION_KEY); +} diff --git a/frontend/src/lib/state/bookshelf.svelte.ts b/frontend/src/lib/state/bookshelf.svelte.ts new file mode 100644 index 0000000..f9a402a --- /dev/null +++ b/frontend/src/lib/state/bookshelf.svelte.ts @@ -0,0 +1,151 @@ +import { goto, invalidate } from '$app/navigation'; +import { addBooksToShelf, createBookshelf, listBookshelves, removeBooksFromShelf } from '$lib/api'; +import type { Book, Bookshelf } from '$lib/schema'; +import { getContext, setContext } from 'svelte'; +import { toast } from 'svelte-sonner'; +import { SvelteMap } from 'svelte/reactivity'; + +export class BookshelfState { + readonly libraryBookshelves = new SvelteMap(); + + getBookshelves(libraryId: string | number): Bookshelf[] | undefined { + const id = libraryId.toString(); + + if (!this.libraryBookshelves.has(id)) { + this.fetchBookshelves(id).then(shelves => { + this.libraryBookshelves.set(id, shelves); + }); + } + + return this.libraryBookshelves.get(id); + } + + async fetchBookshelves(libraryId: string) { + try { + let paginatedBookshelves = await listBookshelves({ + libraries: [libraryId] + }); + + return paginatedBookshelves.items; + } catch (error) { + console.error('Failed to retrieve bookshelves: ', error); + } + } + + async addBookshelf(name: string, libraryId?: string | number, booksToAdd?: string[] | number[]) { + try { + let bookshelf = await createBookshelf({ + title: name, + library_id: libraryId, + book_ids: booksToAdd + }) + + if (bookshelf.library_id) { + const currentShelves = this.libraryBookshelves.get(bookshelf.library_id.toString()) || []; + this.libraryBookshelves.set(bookshelf.library_id.toString(), [...currentShelves, bookshelf]); + } + + invalidate('app:books') + + if (booksToAdd?.length) + toast.success(`Added ${booksToAdd.length} books to '${name}'`) + else + toast.success(`Created shelf '${name}'`) + + return bookshelf + + } catch (error) { + toast.error(`Failed to create bookshelf '${name}'`) + console.error(`Failed to create bookshelf: `, error) + } + } + + async addBooksToShelf(shelfId: number | string, bookIds: number[]) { + try { + const shelf = await addBooksToShelf({ + shelf_id: shelfId, + book_ids: bookIds + }); + + this.updateShelf(shelf) + + if (bookIds.length === 1) toast.success(`Added book to shelf!`); + else toast.success(`Added ${bookIds.length} books to shelf!`); + } catch (error) { + console.error('Failed to add book(s) to shelf: ', error); + toast.error('Failed to add book(s) to shelf.'); + } + } + + async removeBooksFromShelf(shelfId: number | string, bookIds: number[]) { + try { + const shelf = await removeBooksFromShelf({ + shelf_id: shelfId, + book_ids: bookIds + }); + + this.updateShelf(shelf) + + if (bookIds.length === 1) toast.success(`Removed book from shelf.`); + else toast.success(`Removed ${bookIds.length} books from shelf!`); + } catch (error) { + console.error('Failed to remove book(s) from shelf: ', error); + toast.error('Failed to remove book(s) from shelf.'); + } + } + + async updateShelf(shelf: Bookshelf) { + if (!shelf.library_id) return; + const bookshelves = this.libraryBookshelves.get(shelf.library_id.toString()) + if (!bookshelves) return; + + const index = bookshelves.findIndex(bookshelf => bookshelf.id === shelf.id) + if (index !== -1) { + this.libraryBookshelves.set( + shelf.library_id.toString(), + [...bookshelves.slice(0, index), shelf, ...bookshelves.slice(index + 1)] + ); + } + } + + deletedBooks(books: Book[]) { + // Assume all books are in the same library + const libraryId = books[0].library_id.toString() + const bookshelves = this.libraryBookshelves.get(libraryId); + if (!bookshelves) return; + + // Create a Set of shelf IDs that need updating for efficient lookup + const shelfIdsToUpdate = new Set(); + books.forEach(book => { + book.lists.forEach(shelf => { + shelfIdsToUpdate.add(shelf.id); + }); + }); + + const updatedBookshelves = bookshelves.map(shelf => { + if (shelfIdsToUpdate.has(shelf.id)) { + // Count how many times this shelf appears across all deleted books + let decrementBy = 0; + books.forEach(book => { + if (book.lists.some(s => s.id === shelf.id)) { + decrementBy++; + } + }); + return { ...shelf, total: shelf.total - decrementBy }; + } + return shelf; + }); + + this.libraryBookshelves.set(libraryId, updatedBookshelves); + } + } + +const BOOKSHELF_KEY = Symbol('BOOKSHELF'); + +export function setBookshelfState() { + return setContext(BOOKSHELF_KEY, new BookshelfState()); +} + +export function getBookshelfState() { + return getContext>(BOOKSHELF_KEY); +} diff --git a/frontend/src/lib/state/library.svelte.ts b/frontend/src/lib/state/library.svelte.ts new file mode 100644 index 0000000..d584f3a --- /dev/null +++ b/frontend/src/lib/state/library.svelte.ts @@ -0,0 +1,83 @@ +import { browser } from '$app/environment'; +import { goto, invalidate } from '$app/navigation'; +import { page } from '$app/state'; +import { deleteLibrary } from '$lib/api'; +import type { Library } from '$lib/schema'; +import { getContext, setContext } from 'svelte'; +import { toast } from 'svelte-sonner'; + +export class LibraryState { + libraries = $state([]); + activeLibrary = $state(undefined); + createDialogOpen = $state(false); + + constructor(libraries: Library[]) { + this.libraries = libraries; + + const activeLibrary = this.libraries.find((lib) => lib.id.toString() === page.params.libraryId); + + let previousLibrary: Library | undefined; + + if (browser) { + previousLibrary = this.libraries.find( + (lib) => lib.id.toString() === localStorage.getItem('previousLibraryId') + ); + } + + this.activeLibrary = activeLibrary || previousLibrary || libraries[0]; + } + + async setActive(libraryId: number) { + this.activeLibrary = this.libraries.find((lib) => lib.id === libraryId) || this.libraries[0]; + if (browser) { + localStorage.setItem('previousLibraryId', this.activeLibrary.id.toString()); + await goto(`/library/${libraryId}/view`, { invalidate: ['app:libraries'] }); + } + } + + updateLibraries(libraries: Library[]) { + this.libraries = libraries; + + // Update the current library as it may have been removed + if (!this.libraries.find((lib) => this.activeLibrary?.id === lib.id)) + this.activeLibrary = libraries[0] || undefined; + } + + async deleteLibrary(libraryId: number) { + // Store library with its original index + const libIndex = this.libraries.findIndex((lib) => lib.id === libraryId); + const deletionSnapshot = { library: this.libraries[libIndex], index: libIndex }; + + // Optimistically delete the library + this.libraries = this.libraries.filter((lib) => lib.id !== libraryId); + + try { + // Delete library via API + await deleteLibrary(libraryId); + toast.success(`Deleted library '${deletionSnapshot.library}'`); + } catch (err) { + // Delete failed; restore library at its original position + this.libraries.splice(deletionSnapshot.index, 0, deletionSnapshot.library); + toast.error('Failed to delete library'); + console.error('Failed to delete library: ', err); + } + } + + addLibrary(library: Library) { + this.libraries.push(library); + } + + openLibraryCreateDialog() { + this.createDialogOpen = true; + } +} + +const LIBRARY_KEY = Symbol('LIBRARY'); + +export function setLibraryState(libraries: Library[]) { + return setContext(LIBRARY_KEY, new LibraryState(libraries)); +} + +export function getLibraryState() { + return getContext>(LIBRARY_KEY); +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts new file mode 100644 index 0000000..638d1d0 --- /dev/null +++ b/frontend/src/lib/utils.ts @@ -0,0 +1,68 @@ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChild = T extends { child?: any } ? Omit : T; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type WithoutChildren = T extends { children?: any } ? Omit : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { ref?: U | null }; + +export function createQueryParams( + data: Record +) { + const params = new URLSearchParams(); + + for (const [key, value] of Object.entries(data)) { + if (value === undefined || value === null) continue; + + if (Array.isArray(value)) { + value.forEach((item) => { + if (item !== null && item !== undefined) { + params.append(key, String(item)); + } + }); + } else { + params.append(key, String(value)); + } + } + + return params; +} + +export function formatFileSize(bytes: number, decimals = 1, binary = true) { + if (!bytes) return '0 B'; + + // Use 1024 for binary (default) or 1000 for decimal + const divisor = binary ? 1024 : 1000; + + // Units for binary and decimal representations + const units = binary + ? ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'] + : ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + + // Find the appropriate unit + const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(divisor)), units.length - 1); + const size = bytes / Math.pow(divisor, exponent); + + // Format the number with appropriate decimals + const formattedSize = size.toFixed( + // Don't show decimals for bytes + exponent === 0 ? 0 : decimals + ); + + return `${formattedSize} ${units[exponent]}`; +} + +export function getFileType(filename: string) { + const parts = filename.split('.'); + if (parts.length < 2) return 'UNKNOWN'; + const extension = parts[parts.length - 1]; + return extension.toUpperCase(); +} + +export const pluck = (array: [], key: string) => array.map((obj) => obj?.[key]); diff --git a/frontend/src/routes/(root)/(library)/+layout.svelte b/frontend/src/routes/(root)/(library)/+layout.svelte new file mode 100644 index 0000000..8ef251b --- /dev/null +++ b/frontend/src/routes/(root)/(library)/+layout.svelte @@ -0,0 +1,37 @@ + + + + +{@render children?.()} + + + + diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/+page.server.ts b/frontend/src/routes/(root)/(library)/book/[bookId]/+page.server.ts new file mode 100644 index 0000000..abcea1b --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/+page.server.ts @@ -0,0 +1,9 @@ +import { getBook } from '$lib/api'; + +export async function load({ params, depends }) { + depends('app:books'); + + return { + book: await getBook(params.bookId) + }; +} diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/+page.svelte b/frontend/src/routes/(root)/(library)/book/[bookId]/+page.svelte new file mode 100644 index 0000000..9e669df --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/+page.svelte @@ -0,0 +1,527 @@ + + +
+
+ + + +
+ +

{book.title}

+ + {#if book?.subtitle} +

{book.subtitle}

+ {/if} + + {#if book.series} +

+ {book.series.title} + {book.series_position ? `#${book.series_position}` : ''} +

+ {/if} + + {#if book.authors && book.authors.length > 0} +

+ By + {#each book.authors as author} + {author.name}   + {/each} +

+ {/if} + +
+ + {#if book?.tags.length > 0} +
+ + Tags: + {#each book.tags as tag (tag.id)} + {tag.name} + {/each} +
+ {/if} + + + {#if book.identifiers && Object.keys(book.identifiers).length > 0} +
+ + Identifiers: + {#each Object.entries(book.identifiers) as [name, value] (name)} + {name} + {/each} +
+ {/if} + + + {#if book.publisher} +
+ + Publisher: + {book.publisher.name} +
+ {/if} + + + {#if book.published_date} +
+ + Date published: + {book.published_date} +
+ {/if} + + + {#if book.pages} +
+ + Pages: + {book.pages} +
+ {/if} + + + {#if book.description} + + {/if} + + + + + + +
+ Library Files + {book.files.length} +
+
+ + + + + Filename + Size + File type + Actions + + + + {#each book.files as file (file.id)} + + +
{file.filename}
+
+ {formatFileSize(file.size)} + {getFileType(file.filename)} + +
+ + {#if getFileType(file.filename) == 'EPUB' || getFileType(file.filename) == 'PDF'} + + + + + + +

Read

+
+
+
+ {/if} + + + + + { + await bookOps.downloadBookFile(book.id, file.id, file.filename); + }} + > + + + +

Download

+
+
+
+ + + + + + { + fileToDelete = file.id; + fileDeleteDialogOpen = true; + }} + class="{buttonVariants({ + variant: 'destructive', + size: 'icon' + })} scale-90" + > + + + Delete File + + +
+
+
+ {/each} +
+
+
+
+
+
+
+
+
+ + + + + Are you absolutely sure? + + This action cannot be undone. This will permanently delete the record from the database and + the file from the filesystem. + + +
+ + Delete files from the filesystem +
+ + Cancel + { + await bookOps.deleteBookFiles(book.id, [fileToDelete!], deleteFiles); + fileDeleteDialogOpen = false; + }} + class={buttonVariants({ variant: 'destructive' })}>Delete + +
+
+ + { + const bookshelf = await bookshelfState.addBookshelf(name, libraryState.activeLibrary!.id, [book.id]) + book.lists.push(bookshelf) + createShelfDialogOpen = false + }} +/> diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/edit/+page.svelte b/frontend/src/routes/(root)/(library)/book/[bookId]/edit/+page.svelte new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/read/+layout@.svelte b/frontend/src/routes/(root)/(library)/book/[bookId]/read/+layout@.svelte new file mode 100644 index 0000000..01e30c7 --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/read/+layout@.svelte @@ -0,0 +1,8 @@ + + +{@render children?.()} diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.svelte b/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.svelte new file mode 100644 index 0000000..727d78f --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.svelte @@ -0,0 +1,21 @@ + + +
+ +
diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.ts b/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.ts new file mode 100644 index 0000000..eb6b858 --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/read/epub/[fileId]/+page.ts @@ -0,0 +1,17 @@ +export async function load({ fetch, params, parent }) { + try { + const response = await fetch(`/api/books/${params.bookId}`); + const result = await response.json(); + let bookProgress = result.progress; + + return { + bookProgress + }; + } catch (error) { + console.error('Error fetching book: ', error); + return { + status: error.status || 500, + error: error.message + }; + } +} diff --git a/frontend/src/routes/(root)/(library)/book/[bookId]/read/pdf/[fileId]/+page.svelte b/frontend/src/routes/(root)/(library)/book/[bookId]/read/pdf/[fileId]/+page.svelte new file mode 100644 index 0000000..c3c1b27 --- /dev/null +++ b/frontend/src/routes/(root)/(library)/book/[bookId]/read/pdf/[fileId]/+page.svelte @@ -0,0 +1,42 @@ + + +
+ +
+ + diff --git a/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.svelte b/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.svelte new file mode 100644 index 0000000..7fbab30 --- /dev/null +++ b/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.svelte @@ -0,0 +1,45 @@ + + + +
+ + + + +
+ + {#if data.recentlyAdded.length === 0 } +
+ + + + + + + Library Empty + + This library doesn't have any books yet. Get started by uploading your first books. + + + + + + +
+ {/if} +
diff --git a/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.ts b/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.ts new file mode 100644 index 0000000..c7c8cac --- /dev/null +++ b/frontend/src/routes/(root)/(library)/library/[libraryId]/+page.ts @@ -0,0 +1,40 @@ +export async function load({ params, fetch }) { + try { + const continueReadingResponse = await fetch( + `/api/books?libraries=${params.libraryId}&progress=in_progress&orderBy=last_accessed&sortOrder=desc` + ); + let results = await continueReadingResponse.json(); + let continueReading = results['items']; + + const discoverResponse = await fetch( + `/api/books?libraries=${params.libraryId}&progress=unread&sortOrder=random` + ); + results = await discoverResponse.json(); + let discover = results['items']; + + const readAgainResponse = await fetch( + `/api/books?libraries=${params.libraryId}&progress=read&sortOrder=random` + ); + results = await readAgainResponse.json(); + let readAgain = results['items']; + + const recentlyAddedResponse = await fetch( + `/api/books?libraries=${params.libraryId}&orderBy=create_at&sortOrder=desc&progress=unread` + ); + results = await recentlyAddedResponse.json(); + let recentlyAdded = results['items']; + + return { + continueReading, + discover, + readAgain, + recentlyAdded + }; + } catch (error) { + console.error('Error fetching books from library: ', error); + return { + status: error.status || 500, + error: error.message + }; + } +} diff --git a/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+layout.svelte b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+layout.svelte new file mode 100644 index 0000000..c39c3f5 --- /dev/null +++ b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+layout.svelte @@ -0,0 +1,7 @@ + + +
+ {@render children?.()} +
diff --git a/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.server.ts b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.server.ts new file mode 100644 index 0000000..be8bd2b --- /dev/null +++ b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.server.ts @@ -0,0 +1,60 @@ +import { listAuthors } from '$lib/api/author.remote.js'; +import { listBooks } from '$lib/api/book.remote.js'; +import { listBookshelves } from '$lib/api/bookshelf.remote.js'; +import { listPublishers } from '$lib/api/publisher.remote.js'; +import { listTags } from '$lib/api/tag.remote.js'; +import { redirect } from '@sveltejs/kit'; + +export async function load({ params, url, depends }) { + depends('app:books'); + + // Ensure the default parameters exist + const searchParams = url.searchParams; + + const defaults = { + orderBy: 'title', + sortOrder: 'asc' + }; + + let needsRedirect = false; + const newParams = new URLSearchParams(searchParams); + + // Check and set defaults only if missing + for (const [key, value] of Object.entries(defaults)) { + if (!searchParams.has(key)) { + newParams.set(key, value); + needsRedirect = true; + } + } + + if (needsRedirect) { + throw redirect(302, `${url.pathname}?${newParams.toString()}`); + } + + // Convert searchParams to object, preserving arrays + const paramsObject: Record = {}; + for (const [key, value] of searchParams.entries()) { + const allValues = searchParams.getAll(key); + paramsObject[key] = allValues.length > 1 ? allValues : value; + } + + const [books, authors, publishers, tags, bookshelves] = await Promise.all([ + listBooks({ + libraries: [params.libraryId], + ...paramsObject, + pageSize: 50 + }), + listAuthors({ libraries: [params.libraryId], pageSize: 500 }), + listPublishers({ libraries: [params.libraryId], pageSize: 500 }), + listTags({ libraries: [params.libraryId], pageSize: 500 }), + listBookshelves({ libraries: [params.libraryId], pageSize: 500 }) + ]); + + return { + books, + authors, + publishers, + tags, + bookshelves + }; +} diff --git a/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.svelte b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.svelte new file mode 100644 index 0000000..c2a28ab --- /dev/null +++ b/frontend/src/routes/(root)/(library)/library/[libraryId]/view/+page.svelte @@ -0,0 +1,48 @@ + + +
+ +
diff --git a/frontend/src/routes/(root)/+layout.server.ts b/frontend/src/routes/(root)/+layout.server.ts new file mode 100644 index 0000000..15cdb65 --- /dev/null +++ b/frontend/src/routes/(root)/+layout.server.ts @@ -0,0 +1,9 @@ +import { listLibraries } from '$lib/api/library.remote.js'; + +export const load = async ({ depends }) => { + depends('app:libraries'); + + return { + libraries: await listLibraries({ pageSize: 100 }) + }; +}; diff --git a/frontend/src/routes/(root)/+layout.svelte b/frontend/src/routes/(root)/+layout.svelte new file mode 100644 index 0000000..a8d216e --- /dev/null +++ b/frontend/src/routes/(root)/+layout.svelte @@ -0,0 +1,39 @@ + + + + + +
+ +
+ + + +
+ {@render children?.()} +
+
+
+
+
diff --git a/frontend/src/routes/(root)/+page.server.ts b/frontend/src/routes/(root)/+page.server.ts new file mode 100644 index 0000000..71f7807 --- /dev/null +++ b/frontend/src/routes/(root)/+page.server.ts @@ -0,0 +1,8 @@ +import { redirect } from '@sveltejs/kit'; + +export async function load({ parent }) { + const { libraries } = await parent(); + + // Immediately redirect to the library page + redirect(303, `/library/${libraries.items[0]?.id}`); +} diff --git a/frontend/src/routes/(root)/settings/+layout.svelte b/frontend/src/routes/(root)/settings/+layout.svelte new file mode 100644 index 0000000..8fabbcc --- /dev/null +++ b/frontend/src/routes/(root)/settings/+layout.svelte @@ -0,0 +1,51 @@ + + +
+

Settings

+ +
+
+ + + + + {#each items as item} + + + {#snippet child({ props })} + + {item.title} + + {/snippet} + + + {/each} + + + + +
+ +
{@render children()}
+
+
diff --git a/frontend/src/routes/(root)/settings/+page.ts b/frontend/src/routes/(root)/settings/+page.ts new file mode 100644 index 0000000..eba8368 --- /dev/null +++ b/frontend/src/routes/(root)/settings/+page.ts @@ -0,0 +1,8 @@ +import { redirect } from '@sveltejs/kit'; + +export async function load({ parent }) { + const { libraries } = await parent(); + + // Immediately redirect to the account settings + redirect(303, `/settings/account`); +} diff --git a/frontend/src/routes/(root)/settings/account/+page.svelte b/frontend/src/routes/(root)/settings/account/+page.svelte new file mode 100644 index 0000000..b8040b6 --- /dev/null +++ b/frontend/src/routes/(root)/settings/account/+page.svelte @@ -0,0 +1,23 @@ + + +

Account Settings

+

Manage your account

+ +
+ +
diff --git a/frontend/src/routes/(root)/settings/libraries/+page.server.ts b/frontend/src/routes/(root)/settings/libraries/+page.server.ts new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/routes/(root)/settings/libraries/+page.svelte b/frontend/src/routes/(root)/settings/libraries/+page.svelte new file mode 100644 index 0000000..f05c007 --- /dev/null +++ b/frontend/src/routes/(root)/settings/libraries/+page.svelte @@ -0,0 +1,43 @@ + + +

Library Settings

+

Manage your libraries

+ + + + + Libraries + + + + + {#each libraryState.libraries as library} + + {library.name[0]} + {library.name} + + + {/each} + + + + diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte new file mode 100644 index 0000000..1cbf3fe --- /dev/null +++ b/frontend/src/routes/+layout.svelte @@ -0,0 +1,17 @@ + + + + + + +
+ +
+ {@render children?.()} +
+
diff --git a/frontend/src/routes/api/[...path]/+server.ts b/frontend/src/routes/api/[...path]/+server.ts new file mode 100644 index 0000000..35125d3 --- /dev/null +++ b/frontend/src/routes/api/[...path]/+server.ts @@ -0,0 +1,148 @@ +// src/routes/api/[...path]/+server.ts +import { BACKEND_API_URL } from '$lib/server/config'; +import { json, error } from '@sveltejs/kit'; +// import type { RequestHandler } from './$types'; + +// Helper function to handle both JSON and file responses +async function handleResponse(response: Response) { + if (!response.ok) { + throw error(response.status, await response.text()); + } + + const contentType = response.headers.get('Content-Type') || ''; + + if (contentType.includes('application/json')) { + // Handle JSON response + const data = await response.json(); + return json(data); + } else { + // Handle file or other non-JSON response + const responseBody = await response.arrayBuffer(); + + return new Response(responseBody, { + status: response.status, + headers: { + 'Content-Type': contentType, + 'Content-Disposition': response.headers.get('Content-Disposition') || '', + 'Content-Length': response.headers.get('Content-Length') || '' + } + }); + } +} + +// Shared function to prepare the request with authentication +function prepareRequest(locals: App.Locals, request: Request) { + const token = locals.authToken || 'server-default-token'; + + const headers = new Headers({ + Authorization: `Bearer ${token}` + }); + + // Forward important headers from the original request + const contentType = request.headers.get('Content-Type'); + if (contentType) headers.set('Content-Type', contentType); + + const accept = request.headers.get('Accept'); + if (accept) headers.set('Accept', accept); + + return headers; +} + +// GET handler +export const GET: RequestHandler = async ({ params, locals, fetch, request, url }) => { + try { + const path = params.path; + const queryString = url.search; + const backendUrl = `${BACKEND_API_URL}/${path}${queryString}`; + const headers = prepareRequest(locals, request); + + const response = await fetch(backendUrl, { + method: 'GET', + headers + }); + + return handleResponse(response); + } catch (e) { + console.error('API proxy error (GET):', e); + throw error(500, 'Failed to fetch from API'); + } +}; + +// POST handler +export const POST: RequestHandler = async ({ params, locals, fetch, request, url }) => { + try { + const path = params.path; + const queryString = url.search; + const backendUrl = `${BACKEND_API_URL}/${path}${queryString}`; + const headers = prepareRequest(locals, request); + + // Get the request body + const body = await request.arrayBuffer(); + + const response = await fetch(backendUrl, { + method: 'POST', + headers, + body + }); + + return handleResponse(response); + } catch (e) { + console.error('API proxy error (POST):', e); + throw error(500, 'Failed to post to API'); + } +}; + +// PATCH handler +export const PATCH: RequestHandler = async ({ params, locals, fetch, request, url }) => { + try { + const path = params.path; + const queryString = url.search; + const backendUrl = `${BACKEND_API_URL}/${path}${queryString}`; + const headers = prepareRequest(locals, request); + + // Get the request body + const body = await request.arrayBuffer(); + + const response = await fetch(backendUrl, { + method: 'PATCH', + headers, + body + }); + + return handleResponse(response); + } catch (e) { + console.error('API proxy error (PATCH):', e); + throw error(500, 'Failed to update API resource'); + } +}; + +// DELETE handler +export const DELETE: RequestHandler = async ({ params, locals, fetch, request, url }) => { + try { + const path = params.path; + const queryString = url.search; + const backendUrl = `${BACKEND_API_URL}/${path}${queryString}`; + const headers = prepareRequest(locals, request); + + // DELETE may or may not have a body + let options: RequestInit = { + method: 'DELETE', + headers + }; + + // Add body if the request has one + if ( + request.headers.get('Content-Length') && + parseInt(request.headers.get('Content-Length') || '0') > 0 + ) { + options.body = await request.arrayBuffer(); + } + + const response = await fetch(backendUrl, options); + + return response; + } catch (e) { + console.error('API proxy error (DELETE):', e); + throw error(500, 'Failed to delete API resource'); + } +}; diff --git a/frontend/src/routes/login/+layout@.svelte b/frontend/src/routes/login/+layout@.svelte new file mode 100644 index 0000000..376b8d7 --- /dev/null +++ b/frontend/src/routes/login/+layout@.svelte @@ -0,0 +1,31 @@ + + + + + + + + + +
+ +
+

📚

+ chitai + + +
+ + +
+ {@render children?.()} +
+
diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte new file mode 100644 index 0000000..a1914b5 --- /dev/null +++ b/frontend/src/routes/login/+page.svelte @@ -0,0 +1,33 @@ + + +
+
+ + + Login + Sign Up + +
+ + {#if tabValue === 'login'} + + {/if} + + + + {#if tabValue === 'signup'} + + {/if} + +
+
+
+
diff --git a/frontend/static/images/default_cover.jpg b/frontend/static/images/default_cover.jpg new file mode 100644 index 0000000..2cf4ed9 Binary files /dev/null and b/frontend/static/images/default_cover.jpg differ diff --git a/frontend/static/pdfjs/LICENSE b/frontend/static/pdfjs/LICENSE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/frontend/static/pdfjs/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/frontend/static/pdfjs/build/pdf.mjs b/frontend/static/pdfjs/build/pdf.mjs new file mode 100644 index 0000000..a33949b --- /dev/null +++ b/frontend/static/pdfjs/build/pdf.mjs @@ -0,0 +1,25901 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 5.4.296 + * pdfjsBuild = f56dc8601 + */ +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; + +;// ./src/shared/util.js +const isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser"); +const FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0]; +const LINE_FACTOR = 1.35; +const LINE_DESCENT_FACTOR = 0.35; +const BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR; +const RenderingIntentFlag = { + ANY: 0x01, + DISPLAY: 0x02, + PRINT: 0x04, + SAVE: 0x08, + ANNOTATIONS_FORMS: 0x10, + ANNOTATIONS_STORAGE: 0x20, + ANNOTATIONS_DISABLE: 0x40, + IS_EDITING: 0x80, + OPLIST: 0x100 +}; +const AnnotationMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_FORMS: 2, + ENABLE_STORAGE: 3 +}; +const AnnotationEditorPrefix = "pdfjs_internal_editor_"; +const AnnotationEditorType = { + DISABLE: -1, + NONE: 0, + FREETEXT: 3, + HIGHLIGHT: 9, + STAMP: 13, + INK: 15, + POPUP: 16, + SIGNATURE: 101, + COMMENT: 102 +}; +const AnnotationEditorParamsType = { + RESIZE: 1, + CREATE: 2, + FREETEXT_SIZE: 11, + FREETEXT_COLOR: 12, + FREETEXT_OPACITY: 13, + INK_COLOR: 21, + INK_THICKNESS: 22, + INK_OPACITY: 23, + HIGHLIGHT_COLOR: 31, + HIGHLIGHT_THICKNESS: 32, + HIGHLIGHT_FREE: 33, + HIGHLIGHT_SHOW_ALL: 34, + DRAW_STEP: 41 +}; +const PermissionFlag = { + PRINT: 0x04, + MODIFY_CONTENTS: 0x08, + COPY: 0x10, + MODIFY_ANNOTATIONS: 0x20, + FILL_INTERACTIVE_FORMS: 0x100, + COPY_FOR_ACCESSIBILITY: 0x200, + ASSEMBLE: 0x400, + PRINT_HIGH_QUALITY: 0x800 +}; +const TextRenderingMode = { + FILL: 0, + STROKE: 1, + FILL_STROKE: 2, + INVISIBLE: 3, + FILL_ADD_TO_PATH: 4, + STROKE_ADD_TO_PATH: 5, + FILL_STROKE_ADD_TO_PATH: 6, + ADD_TO_PATH: 7, + FILL_STROKE_MASK: 3, + ADD_TO_PATH_FLAG: 4 +}; +const util_ImageKind = { + GRAYSCALE_1BPP: 1, + RGB_24BPP: 2, + RGBA_32BPP: 3 +}; +const AnnotationType = { + TEXT: 1, + LINK: 2, + FREETEXT: 3, + LINE: 4, + SQUARE: 5, + CIRCLE: 6, + POLYGON: 7, + POLYLINE: 8, + HIGHLIGHT: 9, + UNDERLINE: 10, + SQUIGGLY: 11, + STRIKEOUT: 12, + STAMP: 13, + CARET: 14, + INK: 15, + POPUP: 16, + FILEATTACHMENT: 17, + SOUND: 18, + MOVIE: 19, + WIDGET: 20, + SCREEN: 21, + PRINTERMARK: 22, + TRAPNET: 23, + WATERMARK: 24, + THREED: 25, + REDACT: 26 +}; +const AnnotationReplyType = { + GROUP: "Group", + REPLY: "R" +}; +const AnnotationFlag = { + INVISIBLE: 0x01, + HIDDEN: 0x02, + PRINT: 0x04, + NOZOOM: 0x08, + NOROTATE: 0x10, + NOVIEW: 0x20, + READONLY: 0x40, + LOCKED: 0x80, + TOGGLENOVIEW: 0x100, + LOCKEDCONTENTS: 0x200 +}; +const AnnotationFieldFlag = { + READONLY: 0x0000001, + REQUIRED: 0x0000002, + NOEXPORT: 0x0000004, + MULTILINE: 0x0001000, + PASSWORD: 0x0002000, + NOTOGGLETOOFF: 0x0004000, + RADIO: 0x0008000, + PUSHBUTTON: 0x0010000, + COMBO: 0x0020000, + EDIT: 0x0040000, + SORT: 0x0080000, + FILESELECT: 0x0100000, + MULTISELECT: 0x0200000, + DONOTSPELLCHECK: 0x0400000, + DONOTSCROLL: 0x0800000, + COMB: 0x1000000, + RICHTEXT: 0x2000000, + RADIOSINUNISON: 0x2000000, + COMMITONSELCHANGE: 0x4000000 +}; +const AnnotationBorderStyleType = { + SOLID: 1, + DASHED: 2, + BEVELED: 3, + INSET: 4, + UNDERLINE: 5 +}; +const AnnotationActionEventType = { + E: "Mouse Enter", + X: "Mouse Exit", + D: "Mouse Down", + U: "Mouse Up", + Fo: "Focus", + Bl: "Blur", + PO: "PageOpen", + PC: "PageClose", + PV: "PageVisible", + PI: "PageInvisible", + K: "Keystroke", + F: "Format", + V: "Validate", + C: "Calculate" +}; +const DocumentActionEventType = { + WC: "WillClose", + WS: "WillSave", + DS: "DidSave", + WP: "WillPrint", + DP: "DidPrint" +}; +const PageActionEventType = { + O: "PageOpen", + C: "PageClose" +}; +const VerbosityLevel = { + ERRORS: 0, + WARNINGS: 1, + INFOS: 5 +}; +const OPS = { + dependency: 1, + setLineWidth: 2, + setLineCap: 3, + setLineJoin: 4, + setMiterLimit: 5, + setDash: 6, + setRenderingIntent: 7, + setFlatness: 8, + setGState: 9, + save: 10, + restore: 11, + transform: 12, + moveTo: 13, + lineTo: 14, + curveTo: 15, + curveTo2: 16, + curveTo3: 17, + closePath: 18, + rectangle: 19, + stroke: 20, + closeStroke: 21, + fill: 22, + eoFill: 23, + fillStroke: 24, + eoFillStroke: 25, + closeFillStroke: 26, + closeEOFillStroke: 27, + endPath: 28, + clip: 29, + eoClip: 30, + beginText: 31, + endText: 32, + setCharSpacing: 33, + setWordSpacing: 34, + setHScale: 35, + setLeading: 36, + setFont: 37, + setTextRenderingMode: 38, + setTextRise: 39, + moveText: 40, + setLeadingMoveText: 41, + setTextMatrix: 42, + nextLine: 43, + showText: 44, + showSpacedText: 45, + nextLineShowText: 46, + nextLineSetSpacingShowText: 47, + setCharWidth: 48, + setCharWidthAndBounds: 49, + setStrokeColorSpace: 50, + setFillColorSpace: 51, + setStrokeColor: 52, + setStrokeColorN: 53, + setFillColor: 54, + setFillColorN: 55, + setStrokeGray: 56, + setFillGray: 57, + setStrokeRGBColor: 58, + setFillRGBColor: 59, + setStrokeCMYKColor: 60, + setFillCMYKColor: 61, + shadingFill: 62, + beginInlineImage: 63, + beginImageData: 64, + endInlineImage: 65, + paintXObject: 66, + markPoint: 67, + markPointProps: 68, + beginMarkedContent: 69, + beginMarkedContentProps: 70, + endMarkedContent: 71, + beginCompat: 72, + endCompat: 73, + paintFormXObjectBegin: 74, + paintFormXObjectEnd: 75, + beginGroup: 76, + endGroup: 77, + beginAnnotation: 80, + endAnnotation: 81, + paintImageMaskXObject: 83, + paintImageMaskXObjectGroup: 84, + paintImageXObject: 85, + paintInlineImageXObject: 86, + paintInlineImageXObjectGroup: 87, + paintImageXObjectRepeat: 88, + paintImageMaskXObjectRepeat: 89, + paintSolidColorImageMask: 90, + constructPath: 91, + setStrokeTransparent: 92, + setFillTransparent: 93, + rawFillPath: 94 +}; +const DrawOPS = { + moveTo: 0, + lineTo: 1, + curveTo: 2, + closePath: 3 +}; +const PasswordResponses = { + NEED_PASSWORD: 1, + INCORRECT_PASSWORD: 2 +}; +let verbosity = VerbosityLevel.WARNINGS; +function setVerbosityLevel(level) { + if (Number.isInteger(level)) { + verbosity = level; + } +} +function getVerbosityLevel() { + return verbosity; +} +function info(msg) { + if (verbosity >= VerbosityLevel.INFOS) { + console.info(`Info: ${msg}`); + } +} +function warn(msg) { + if (verbosity >= VerbosityLevel.WARNINGS) { + console.warn(`Warning: ${msg}`); + } +} +function unreachable(msg) { + throw new Error(msg); +} +function assert(cond, msg) { + if (!cond) { + unreachable(msg); + } +} +function _isValidProtocol(url) { + switch (url?.protocol) { + case "http:": + case "https:": + case "ftp:": + case "mailto:": + case "tel:": + return true; + default: + return false; + } +} +function createValidAbsoluteUrl(url, baseUrl = null, options = null) { + if (!url) { + return null; + } + if (options && typeof url === "string") { + if (options.addDefaultProtocol && url.startsWith("www.")) { + const dots = url.match(/\./g); + if (dots?.length >= 2) { + url = `http://${url}`; + } + } + if (options.tryConvertEncoding) { + try { + url = stringToUTF8String(url); + } catch {} + } + } + const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return _isValidProtocol(absoluteUrl) ? absoluteUrl : null; +} +function updateUrlHash(url, hash, allowRel = false) { + const res = URL.parse(url); + if (res) { + res.hash = hash; + return res.href; + } + if (allowRel && createValidAbsoluteUrl(url, "http://example.com")) { + return url.split("#", 1)[0] + `${hash ? `#${hash}` : ""}`; + } + return ""; +} +function shadow(obj, prop, value, nonSerializable = false) { + Object.defineProperty(obj, prop, { + value, + enumerable: !nonSerializable, + configurable: true, + writable: false + }); + return value; +} +const BaseException = function BaseExceptionClosure() { + function BaseException(message, name) { + this.message = message; + this.name = name; + } + BaseException.prototype = new Error(); + BaseException.constructor = BaseException; + return BaseException; +}(); +class PasswordException extends BaseException { + constructor(msg, code) { + super(msg, "PasswordException"); + this.code = code; + } +} +class UnknownErrorException extends BaseException { + constructor(msg, details) { + super(msg, "UnknownErrorException"); + this.details = details; + } +} +class InvalidPDFException extends BaseException { + constructor(msg) { + super(msg, "InvalidPDFException"); + } +} +class ResponseException extends BaseException { + constructor(msg, status, missing) { + super(msg, "ResponseException"); + this.status = status; + this.missing = missing; + } +} +class FormatError extends BaseException { + constructor(msg) { + super(msg, "FormatError"); + } +} +class AbortException extends BaseException { + constructor(msg) { + super(msg, "AbortException"); + } +} +function bytesToString(bytes) { + if (typeof bytes !== "object" || bytes?.length === undefined) { + unreachable("Invalid argument for bytesToString"); + } + const length = bytes.length; + const MAX_ARGUMENT_COUNT = 8192; + if (length < MAX_ARGUMENT_COUNT) { + return String.fromCharCode.apply(null, bytes); + } + const strBuf = []; + for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) { + const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length); + const chunk = bytes.subarray(i, chunkEnd); + strBuf.push(String.fromCharCode.apply(null, chunk)); + } + return strBuf.join(""); +} +function stringToBytes(str) { + if (typeof str !== "string") { + unreachable("Invalid argument for stringToBytes"); + } + const length = str.length; + const bytes = new Uint8Array(length); + for (let i = 0; i < length; ++i) { + bytes[i] = str.charCodeAt(i) & 0xff; + } + return bytes; +} +function string32(value) { + return String.fromCharCode(value >> 24 & 0xff, value >> 16 & 0xff, value >> 8 & 0xff, value & 0xff); +} +function objectSize(obj) { + return Object.keys(obj).length; +} +function isLittleEndian() { + const buffer8 = new Uint8Array(4); + buffer8[0] = 1; + const view32 = new Uint32Array(buffer8.buffer, 0, 1); + return view32[0] === 1; +} +function isEvalSupported() { + try { + new Function(""); + return true; + } catch { + return false; + } +} +class util_FeatureTest { + static get isLittleEndian() { + return shadow(this, "isLittleEndian", isLittleEndian()); + } + static get isEvalSupported() { + return shadow(this, "isEvalSupported", isEvalSupported()); + } + static get isOffscreenCanvasSupported() { + return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined"); + } + static get isImageDecoderSupported() { + return shadow(this, "isImageDecoderSupported", typeof ImageDecoder !== "undefined"); + } + static get platform() { + const { + platform, + userAgent + } = navigator; + return shadow(this, "platform", { + isAndroid: userAgent.includes("Android"), + isLinux: platform.includes("Linux"), + isMac: platform.includes("Mac"), + isWindows: platform.includes("Win"), + isFirefox: userAgent.includes("Firefox") + }); + } + static get isCSSRoundSupported() { + return shadow(this, "isCSSRoundSupported", globalThis.CSS?.supports?.("width: round(1.5px, 1px)")); + } +} +const hexNumbers = Array.from(Array(256).keys(), n => n.toString(16).padStart(2, "0")); +class Util { + static makeHexColor(r, g, b) { + return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`; + } + static domMatrixToTransform(dm) { + return [dm.a, dm.b, dm.c, dm.d, dm.e, dm.f]; + } + static scaleMinMax(transform, minMax) { + let temp; + if (transform[0]) { + if (transform[0] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[0]; + minMax[2] *= transform[0]; + if (transform[3] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[3]; + minMax[3] *= transform[3]; + } else { + temp = minMax[0]; + minMax[0] = minMax[1]; + minMax[1] = temp; + temp = minMax[2]; + minMax[2] = minMax[3]; + minMax[3] = temp; + if (transform[1] < 0) { + temp = minMax[1]; + minMax[1] = minMax[3]; + minMax[3] = temp; + } + minMax[1] *= transform[1]; + minMax[3] *= transform[1]; + if (transform[2] < 0) { + temp = minMax[0]; + minMax[0] = minMax[2]; + minMax[2] = temp; + } + minMax[0] *= transform[2]; + minMax[2] *= transform[2]; + } + minMax[0] += transform[4]; + minMax[1] += transform[5]; + minMax[2] += transform[4]; + minMax[3] += transform[5]; + } + static transform(m1, m2) { + return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]]; + } + static multiplyByDOMMatrix(m, md) { + return [m[0] * md.a + m[2] * md.b, m[1] * md.a + m[3] * md.b, m[0] * md.c + m[2] * md.d, m[1] * md.c + m[3] * md.d, m[0] * md.e + m[2] * md.f + m[4], m[1] * md.e + m[3] * md.f + m[5]]; + } + static applyTransform(p, m, pos = 0) { + const p0 = p[pos]; + const p1 = p[pos + 1]; + p[pos] = p0 * m[0] + p1 * m[2] + m[4]; + p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5]; + } + static applyTransformToBezier(p, transform, pos = 0) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + for (let i = 0; i < 6; i += 2) { + const pI = p[pos + i]; + const pI1 = p[pos + i + 1]; + p[pos + i] = pI * m0 + pI1 * m2 + m4; + p[pos + i + 1] = pI * m1 + pI1 * m3 + m5; + } + } + static applyInverseTransform(p, m) { + const p0 = p[0]; + const p1 = p[1]; + const d = m[0] * m[3] - m[1] * m[2]; + p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d; + p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d; + } + static axialAlignedBoundingBox(rect, transform, output) { + const m0 = transform[0]; + const m1 = transform[1]; + const m2 = transform[2]; + const m3 = transform[3]; + const m4 = transform[4]; + const m5 = transform[5]; + const r0 = rect[0]; + const r1 = rect[1]; + const r2 = rect[2]; + const r3 = rect[3]; + let a0 = m0 * r0 + m4; + let a2 = a0; + let a1 = m0 * r2 + m4; + let a3 = a1; + let b0 = m3 * r1 + m5; + let b2 = b0; + let b1 = m3 * r3 + m5; + let b3 = b1; + if (m1 !== 0 || m2 !== 0) { + const m1r0 = m1 * r0; + const m1r2 = m1 * r2; + const m2r1 = m2 * r1; + const m2r3 = m2 * r3; + a0 += m2r1; + a3 += m2r1; + a1 += m2r3; + a2 += m2r3; + b0 += m1r0; + b3 += m1r0; + b1 += m1r2; + b2 += m1r2; + } + output[0] = Math.min(output[0], a0, a1, a2, a3); + output[1] = Math.min(output[1], b0, b1, b2, b3); + output[2] = Math.max(output[2], a0, a1, a2, a3); + output[3] = Math.max(output[3], b0, b1, b2, b3); + } + static inverseTransform(m) { + const d = m[0] * m[3] - m[1] * m[2]; + return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; + } + static singularValueDecompose2dScale(matrix, output) { + const m0 = matrix[0]; + const m1 = matrix[1]; + const m2 = matrix[2]; + const m3 = matrix[3]; + const a = m0 ** 2 + m1 ** 2; + const b = m0 * m2 + m1 * m3; + const c = m2 ** 2 + m3 ** 2; + const first = (a + c) / 2; + const second = Math.sqrt(first ** 2 - (a * c - b ** 2)); + output[0] = Math.sqrt(first + second || 1); + output[1] = Math.sqrt(first - second || 1); + } + static normalizeRect(rect) { + const r = rect.slice(0); + if (rect[0] > rect[2]) { + r[0] = rect[2]; + r[2] = rect[0]; + } + if (rect[1] > rect[3]) { + r[1] = rect[3]; + r[3] = rect[1]; + } + return r; + } + static intersect(rect1, rect2) { + const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2])); + const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2])); + if (xLow > xHigh) { + return null; + } + const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3])); + const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3])); + if (yLow > yHigh) { + return null; + } + return [xLow, yLow, xHigh, yHigh]; + } + static pointBoundingBox(x, y, minMax) { + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static rectBoundingBox(x0, y0, x1, y1, minMax) { + minMax[0] = Math.min(minMax[0], x0, x1); + minMax[1] = Math.min(minMax[1], y0, y1); + minMax[2] = Math.max(minMax[2], x0, x1); + minMax[3] = Math.max(minMax[3], y0, y1); + } + static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) { + if (t <= 0 || t >= 1) { + return; + } + const mt = 1 - t; + const tt = t * t; + const ttt = tt * t; + const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3; + const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3; + minMax[0] = Math.min(minMax[0], x); + minMax[1] = Math.min(minMax[1], y); + minMax[2] = Math.max(minMax[2], x); + minMax[3] = Math.max(minMax[3], y); + } + static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) { + if (Math.abs(a) < 1e-12) { + if (Math.abs(b) >= 1e-12) { + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax); + } + return; + } + const delta = b ** 2 - 4 * c * a; + if (delta < 0) { + return; + } + const sqrtDelta = Math.sqrt(delta); + const a2 = 2 * a; + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax); + this.#getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax); + } + static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) { + minMax[0] = Math.min(minMax[0], x0, x3); + minMax[1] = Math.min(minMax[1], y0, y3); + minMax[2] = Math.max(minMax[2], x0, x3); + minMax[3] = Math.max(minMax[3], y0, y3); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax); + this.#getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax); + } +} +const PDFStringTranslateTable = (/* unused pure expression or super */ null && ([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2d8, 0x2c7, 0x2c6, 0x2d9, 0x2dd, 0x2db, 0x2da, 0x2dc, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018, 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x141, 0x152, 0x160, 0x178, 0x17d, 0x131, 0x142, 0x153, 0x161, 0x17e, 0, 0x20ac])); +function stringToPDFString(str, keepEscapeSequence = false) { + if (str[0] >= "\xEF") { + let encoding; + if (str[0] === "\xFE" && str[1] === "\xFF") { + encoding = "utf-16be"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xFF" && str[1] === "\xFE") { + encoding = "utf-16le"; + if (str.length % 2 === 1) { + str = str.slice(0, -1); + } + } else if (str[0] === "\xEF" && str[1] === "\xBB" && str[2] === "\xBF") { + encoding = "utf-8"; + } + if (encoding) { + try { + const decoder = new TextDecoder(encoding, { + fatal: true + }); + const buffer = stringToBytes(str); + const decoded = decoder.decode(buffer); + if (keepEscapeSequence || !decoded.includes("\x1b")) { + return decoded; + } + return decoded.replaceAll(/\x1b[^\x1b]*(?:\x1b|$)/g, ""); + } catch (ex) { + warn(`stringToPDFString: "${ex}".`); + } + } + } + const strBuf = []; + for (let i = 0, ii = str.length; i < ii; i++) { + const charCode = str.charCodeAt(i); + if (!keepEscapeSequence && charCode === 0x1b) { + while (++i < ii && str.charCodeAt(i) !== 0x1b) {} + continue; + } + const code = PDFStringTranslateTable[charCode]; + strBuf.push(code ? String.fromCharCode(code) : str.charAt(i)); + } + return strBuf.join(""); +} +function stringToUTF8String(str) { + return decodeURIComponent(escape(str)); +} +function utf8StringToString(str) { + return unescape(encodeURIComponent(str)); +} +function isArrayEqual(arr1, arr2) { + if (arr1.length !== arr2.length) { + return false; + } + for (let i = 0, ii = arr1.length; i < ii; i++) { + if (arr1[i] !== arr2[i]) { + return false; + } + } + return true; +} +function getModificationDate(date = new Date()) { + if (!(date instanceof Date)) { + date = new Date(date); + } + const buffer = [date.getUTCFullYear().toString(), (date.getUTCMonth() + 1).toString().padStart(2, "0"), date.getUTCDate().toString().padStart(2, "0"), date.getUTCHours().toString().padStart(2, "0"), date.getUTCMinutes().toString().padStart(2, "0"), date.getUTCSeconds().toString().padStart(2, "0")]; + return buffer.join(""); +} +let NormalizeRegex = null; +let NormalizationMap = null; +function normalizeUnicode(str) { + if (!NormalizeRegex) { + NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu; + NormalizationMap = new Map([["ſt", "ſt"]]); + } + return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2)); +} +function getUuid() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + const buf = new Uint8Array(32); + crypto.getRandomValues(buf); + return bytesToString(buf); +} +const AnnotationPrefix = "pdfjs_internal_id_"; +function _isValidExplicitDest(validRef, validName, dest) { + if (!Array.isArray(dest) || dest.length < 2) { + return false; + } + const [page, zoom, ...args] = dest; + if (!validRef(page) && !Number.isInteger(page)) { + return false; + } + if (!validName(zoom)) { + return false; + } + const argsLen = args.length; + let allowNull = true; + switch (zoom.name) { + case "XYZ": + if (argsLen < 2 || argsLen > 3) { + return false; + } + break; + case "Fit": + case "FitB": + return argsLen === 0; + case "FitH": + case "FitBH": + case "FitV": + case "FitBV": + if (argsLen > 1) { + return false; + } + break; + case "FitR": + if (argsLen !== 4) { + return false; + } + allowNull = false; + break; + default: + return false; + } + for (const arg of args) { + if (typeof arg === "number" || allowNull && arg === null) { + continue; + } + return false; + } + return true; +} +function MathClamp(v, min, max) { + return Math.min(Math.max(v, min), max); +} +function toHexUtil(arr) { + if (Uint8Array.prototype.toHex) { + return arr.toHex(); + } + return Array.from(arr, num => hexNumbers[num]).join(""); +} +function toBase64Util(arr) { + if (Uint8Array.prototype.toBase64) { + return arr.toBase64(); + } + return btoa(bytesToString(arr)); +} +function fromBase64Util(str) { + if (Uint8Array.fromBase64) { + return Uint8Array.fromBase64(str); + } + return stringToBytes(atob(str)); +} +if (typeof Promise.try !== "function") { + Promise.try = function (fn, ...args) { + return new Promise(resolve => { + resolve(fn(...args)); + }); + }; +} +if (typeof Math.sumPrecise !== "function") { + Math.sumPrecise = function (numbers) { + return numbers.reduce((a, b) => a + b, 0); + }; +} + +;// ./src/display/xfa_text.js +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"); + } +} + +;// ./src/display/xfa_layer.js + +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) { + html.setAttribute("value", storedData.value); + for (const option of element.children) { + if (option.attributes.value === storedData.value) { + option.attributes.selected = true; + } else if (option.attributes.hasOwnProperty("selected")) { + delete option.attributes.selected; + } + } + } + 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 isNotForRichText = intent !== "richText"; + const rootDiv = parameters.div; + rootDiv.append(rootHtml); + if (parameters.viewport) { + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; + } + if (isNotForRichText) { + rootDiv.setAttribute("class", "xfaLayer xfaFont"); + } + const textDivs = []; + if (root.children.length === 0) { + if (root.value) { + const node = document.createTextNode(root.value); + rootHtml.append(node); + if (isNotForRichText && XfaText.shouldBuildText(root.name)) { + textDivs.push(node); + } + } + return { + textDivs + }; + } + const stack = [[root, -1, rootHtml]]; + 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; + } + const childHtml = child?.attributes?.xmlns ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name); + html.append(childHtml); + if (child.attributes) { + this.setAttributes({ + html: childHtml, + element: child, + storage, + intent, + linkService + }); + } + if (child.children?.length > 0) { + stack.push([child, -1, childHtml]); + } else if (child.value) { + const node = document.createTextNode(child.value); + if (isNotForRichText && 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; + } +} + +;// ./src/display/display_utils.js + + +const SVG_NS = "http://www.w3.org/2000/svg"; +class PixelsPerInch { + static CSS = 96.0; + static PDF = 72.0; + static PDF_TO_CSS_UNITS = this.CSS / this.PDF; +} +async function fetchData(url, type = "text") { + if (isValidFetchUrl(url, document.baseURI)) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(response.statusText); + } + switch (type) { + case "arraybuffer": + return response.arrayBuffer(); + case "blob": + return response.blob(); + case "json": + return response.json(); + } + return response.text(); + } + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + request.open("GET", url, true); + request.responseType = type; + request.onreadystatechange = () => { + if (request.readyState !== XMLHttpRequest.DONE) { + return; + } + if (request.status === 200 || request.status === 0) { + switch (type) { + case "arraybuffer": + case "blob": + case "json": + resolve(request.response); + return; + } + resolve(request.responseText); + return; + } + reject(new Error(request.statusText)); + }; + request.send(null); + }); +} +class PageViewport { + constructor({ + viewBox, + userUnit, + scale, + rotation, + offsetX = 0, + offsetY = 0, + dontFlip = false + }) { + this.viewBox = viewBox; + this.userUnit = userUnit; + this.scale = scale; + this.rotation = rotation; + this.offsetX = offsetX; + this.offsetY = offsetY; + scale *= userUnit; + 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 dims = this.viewBox; + return shadow(this, "rawDims", { + pageWidth: dims[2] - dims[0], + pageHeight: dims[3] - dims[1], + pageX: dims[0], + pageY: dims[1] + }); + } + clone({ + scale = this.scale, + rotation = this.rotation, + offsetX = this.offsetX, + offsetY = this.offsetY, + dontFlip = false + } = {}) { + return new PageViewport({ + viewBox: this.viewBox.slice(), + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + convertToViewportPoint(x, y) { + const p = [x, y]; + Util.applyTransform(p, this.transform); + return p; + } + convertToViewportRectangle(rect) { + const topLeft = [rect[0], rect[1]]; + Util.applyTransform(topLeft, this.transform); + const bottomRight = [rect[2], rect[3]]; + Util.applyTransform(bottomRight, this.transform); + return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]]; + } + convertToPdfPoint(x, y) { + const p = [x, y]; + Util.applyInverseTransform(p, this.transform); + return p; + } +} +class RenderingCancelledException extends BaseException { + constructor(msg, extraDelay = 0) { + super(msg, "RenderingCancelledException"); + this.extraDelay = extraDelay; + } +} +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) { + [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)) { + warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.'); + return defaultFilename; + } + const getURL = urlString => { + try { + return new URL(urlString); + } catch { + try { + return new URL(decodeURIComponent(urlString)); + } catch { + try { + return new URL(urlString, "https://foo.bar"); + } catch { + try { + return new URL(decodeURIComponent(urlString), "https://foo.bar"); + } catch { + return null; + } + } + } + } + }; + const newURL = getURL(url); + if (!newURL) { + return defaultFilename; + } + const decode = name => { + try { + let decoded = decodeURIComponent(name); + if (decoded.includes("/")) { + decoded = decoded.split("/").at(-1); + if (decoded.test(/^\.pdf$/i)) { + return decoded; + } + return name; + } + return decoded; + } catch { + return name; + } + }; + const pdfRegex = /\.pdf$/i; + const filename = newURL.pathname.split("/").at(-1); + if (pdfRegex.test(filename)) { + return decode(filename); + } + if (newURL.searchParams.size > 0) { + const values = Array.from(newURL.searchParams.values()).reverse(); + for (const value of values) { + if (pdfRegex.test(value)) { + return decode(value); + } + } + const keys = Array.from(newURL.searchParams.keys()).reverse(); + for (const key of keys) { + if (pdfRegex.test(key)) { + return decode(key); + } + } + } + if (newURL.hash) { + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i; + const hashFilename = reFilename.exec(newURL.hash); + if (hashFilename) { + return decode(hashFilename[0]); + } + } + return defaultFilename; +} +class StatTimer { + started = Object.create(null); + times = []; + time(name) { + if (name in this.started) { + warn(`Timer is already running for ${name}`); + } + this.started[name] = Date.now(); + } + timeEnd(name) { + if (!(name in this.started)) { + 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(""); + } +} +function isValidFetchUrl(url, baseUrl) { + const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url); + return res?.protocol === "http:" || res?.protocol === "https:"; +} +function noContextMenu(e) { + e.preventDefault(); +} +function stopEvent(e) { + e.preventDefault(); + e.stopPropagation(); +} +function deprecated(details) { + console.log("Deprecated API usage: " + details); +} +class PDFDateString { + static #regex; + static toDateObject(input) { + if (input instanceof Date) { + return input; + } + if (!input || typeof input !== "string") { + return null; + } + this.#regex ||= new RegExp("^D:" + "(\\d{4})" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "(\\d{2})?" + "([Z|+|-])?" + "(\\d{2})?" + "'?" + "(\\d{2})?" + "'?"); + const matches = this.#regex.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)); + } +} +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, + userUnit: 1, + 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); + } + warn(`Not a valid color format: "${color}"`); + return [0, 0, 0]; +} +function getColorValues(colors) { + const span = document.createElement("span"); + span.style.visibility = "hidden"; + span.style.colorScheme = "only light"; + 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 useRound = util_FeatureTest.isCSSRoundSupported; + const w = `var(--total-scale-factor) * ${pageWidth}px`, + h = `var(--total-scale-factor) * ${pageHeight}px`; + const widthStr = useRound ? `round(down, ${w}, var(--scale-round-x))` : `calc(${w})`, + heightStr = useRound ? `round(down, ${h}, var(--scale-round-y))` : `calc(${h})`; + 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); + } +} +class OutputScale { + constructor() { + const { + pixelRatio + } = OutputScale; + this.sx = pixelRatio; + this.sy = pixelRatio; + } + get scaled() { + return this.sx !== 1 || this.sy !== 1; + } + get symmetric() { + return this.sx === this.sy; + } + limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) { + let maxAreaScale = Infinity, + maxWidthScale = Infinity, + maxHeightScale = Infinity; + maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor); + if (maxPixels > 0) { + maxAreaScale = Math.sqrt(maxPixels / (width * height)); + } + if (maxDim !== -1) { + maxWidthScale = maxDim / width; + maxHeightScale = maxDim / height; + } + const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale); + if (this.sx > maxScale || this.sy > maxScale) { + this.sx = maxScale; + this.sy = maxScale; + return true; + } + return false; + } + static get pixelRatio() { + return globalThis.devicePixelRatio || 1; + } + static capPixels(maxPixels, capAreaFactor) { + if (capAreaFactor >= 0) { + const winPixels = Math.ceil(window.screen.availWidth * window.screen.availHeight * this.pixelRatio ** 2 * (1 + capAreaFactor / 100)); + return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels; + } + return maxPixels; + } +} +const SupportedImageMimeTypes = ["image/apng", "image/avif", "image/bmp", "image/gif", "image/jpeg", "image/png", "image/svg+xml", "image/webp", "image/x-icon"]; +class ColorScheme { + static get isDarkMode() { + return shadow(this, "isDarkMode", !!window?.matchMedia?.("(prefers-color-scheme: dark)").matches); + } +} +class CSSConstants { + static get commentForegroundColor() { + const element = document.createElement("span"); + element.classList.add("comment", "sidebar"); + const { + style + } = element; + style.width = style.height = "0"; + style.display = "none"; + style.color = "var(--comment-fg-color)"; + document.body.append(element); + const { + color + } = window.getComputedStyle(element); + element.remove(); + return shadow(this, "commentForegroundColor", getRGB(color)); + } +} +function applyOpacity(r, g, b, opacity) { + opacity = Math.min(Math.max(opacity ?? 1, 0), 1); + const white = 255 * (1 - opacity); + r = Math.round(r * opacity + white); + g = Math.round(g * opacity + white); + b = Math.round(b * opacity + white); + return [r, g, b]; +} +function RGBToHSL(rgb, output) { + const r = rgb[0] / 255; + const g = rgb[1] / 255; + const b = rgb[2] / 255; + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + const l = (max + min) / 2; + if (max === min) { + output[0] = output[1] = 0; + } else { + const d = max - min; + output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min); + switch (max) { + case r: + output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60; + break; + case g: + output[0] = ((b - r) / d + 2) * 60; + break; + case b: + output[0] = ((r - g) / d + 4) * 60; + break; + } + } + output[2] = l; +} +function HSLToRGB(hsl, output) { + const h = hsl[0]; + const s = hsl[1]; + const l = hsl[2]; + const c = (1 - Math.abs(2 * l - 1)) * s; + const x = c * (1 - Math.abs(h / 60 % 2 - 1)); + const m = l - c / 2; + switch (Math.floor(h / 60)) { + case 0: + output[0] = c + m; + output[1] = x + m; + output[2] = m; + break; + case 1: + output[0] = x + m; + output[1] = c + m; + output[2] = m; + break; + case 2: + output[0] = m; + output[1] = c + m; + output[2] = x + m; + break; + case 3: + output[0] = m; + output[1] = x + m; + output[2] = c + m; + break; + case 4: + output[0] = x + m; + output[1] = m; + output[2] = c + m; + break; + case 5: + case 6: + output[0] = c + m; + output[1] = m; + output[2] = x + m; + break; + } +} +function computeLuminance(x) { + return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; +} +function contrastRatio(hsl1, hsl2, output) { + HSLToRGB(hsl1, output); + output.map(computeLuminance); + const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + HSLToRGB(hsl2, output); + output.map(computeLuminance); + const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2]; + return lum1 > lum2 ? (lum1 + 0.05) / (lum2 + 0.05) : (lum2 + 0.05) / (lum1 + 0.05); +} +const contrastCache = new Map(); +function findContrastColor(baseColor, fixedColor) { + const key = baseColor[0] + baseColor[1] * 0x100 + baseColor[2] * 0x10000 + fixedColor[0] * 0x1000000 + fixedColor[1] * 0x100000000 + fixedColor[2] * 0x10000000000; + let cachedValue = contrastCache.get(key); + if (cachedValue) { + return cachedValue; + } + const array = new Float32Array(9); + const output = array.subarray(0, 3); + const baseHSL = array.subarray(3, 6); + RGBToHSL(baseColor, baseHSL); + const fixedHSL = array.subarray(6, 9); + RGBToHSL(fixedColor, fixedHSL); + const isFixedColorDark = fixedHSL[2] < 0.5; + const minContrast = isFixedColorDark ? 12 : 4.5; + baseHSL[2] = isFixedColorDark ? Math.sqrt(baseHSL[2]) : 1 - Math.sqrt(1 - baseHSL[2]); + if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + let start, end; + if (isFixedColorDark) { + start = baseHSL[2]; + end = 1; + } else { + start = 0; + end = baseHSL[2]; + } + const PRECISION = 0.005; + while (end - start > PRECISION) { + const mid = baseHSL[2] = (start + end) / 2; + if (isFixedColorDark === contrastRatio(baseHSL, fixedHSL, output) < minContrast) { + start = mid; + } else { + end = mid; + } + } + baseHSL[2] = isFixedColorDark ? end : start; + } + HSLToRGB(baseHSL, output); + cachedValue = Util.makeHexColor(Math.round(output[0] * 255), Math.round(output[1] * 255), Math.round(output[2] * 255)); + contrastCache.set(key, cachedValue); + return cachedValue; +} +function renderRichText({ + html, + dir, + className +}, container) { + const fragment = document.createDocumentFragment(); + if (typeof html === "string") { + const p = document.createElement("p"); + p.dir = dir || "auto"; + const lines = html.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")); + } + } + fragment.append(p); + } else { + XfaLayer.render({ + xfaHtml: html, + div: fragment, + intent: "richText" + }); + } + fragment.firstChild.classList.add("richText", className); + container.append(fragment); +} + +;// ./src/display/editor/toolbar.js + +class EditorToolbar { + #toolbar = null; + #colorPicker = null; + #editor; + #buttons = null; + #altText = null; + #comment = null; + #commentButtonDivider = null; + #signatureDescriptionButton = null; + static #l10nRemove = null; + constructor(editor) { + this.#editor = editor; + EditorToolbar.#l10nRemove ||= Object.freeze({ + freetext: "pdfjs-editor-remove-freetext-button", + highlight: "pdfjs-editor-remove-highlight-button", + ink: "pdfjs-editor-remove-ink-button", + stamp: "pdfjs-editor-remove-stamp-button", + signature: "pdfjs-editor-remove-signature-button" + }); + } + render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.classList.add("editToolbar", "hidden"); + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#editor._uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + editToolbar.addEventListener("pointerdown", EditorToolbar.#pointerDown, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + const position = this.#editor.toolbarPosition; + if (position) { + const { + style + } = editToolbar; + const x = this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0]; + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`; + } + return editToolbar; + } + get div() { + return this.#toolbar; + } + static #pointerDown(e) { + e.stopPropagation(); + } + #focusIn(e) { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + } + #focusOut(e) { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + } + #addListenersToElement(element) { + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return false; + } + element.addEventListener("focusin", this.#focusIn.bind(this), { + capture: true, + signal + }); + element.addEventListener("focusout", this.#focusOut.bind(this), { + capture: true, + signal + }); + element.addEventListener("contextmenu", noContextMenu, { + signal + }); + return true; + } + hide() { + this.#toolbar.classList.add("hidden"); + this.#colorPicker?.hideDropdown(); + } + show() { + this.#toolbar.classList.remove("hidden"); + this.#altText?.shown(); + this.#comment?.shown(); + } + addDeleteButton() { + const { + editorType, + _uiManager + } = this.#editor; + const button = document.createElement("button"); + button.classList.add("basic", "deleteButton"); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", EditorToolbar.#l10nRemove[editorType]); + if (this.#addListenersToElement(button)) { + button.addEventListener("click", e => { + _uiManager.delete(); + }, { + signal: _uiManager._signal + }); + } + this.#buttons.append(button); + } + get #divider() { + const divider = document.createElement("div"); + divider.className = "divider"; + return divider; + } + async addAltText(altText) { + const button = await altText.render(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + this.#altText = altText; + } + addComment(comment, beforeElement = null) { + if (this.#comment) { + return; + } + const button = comment.renderForToolbar(); + if (!button) { + return; + } + this.#addListenersToElement(button); + const divider = this.#commentButtonDivider = this.#divider; + if (!beforeElement) { + this.#buttons.append(button, divider); + } else { + this.#buttons.insertBefore(button, beforeElement); + this.#buttons.insertBefore(divider, beforeElement); + } + this.#comment = comment; + comment.toolbar = this; + } + addColorPicker(colorPicker) { + if (this.#colorPicker) { + return; + } + this.#colorPicker = colorPicker; + const button = colorPicker.renderButton(); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + async addEditSignatureButton(signatureManager) { + const button = this.#signatureDescriptionButton = await signatureManager.renderEditButton(this.#editor); + this.#addListenersToElement(button); + this.#buttons.append(button, this.#divider); + } + removeButton(name) { + switch (name) { + case "comment": + this.#comment?.removeToolbarCommentButton(); + this.#comment = null; + this.#commentButtonDivider?.remove(); + this.#commentButtonDivider = null; + break; + } + } + async addButton(name, tool) { + switch (name) { + case "colorPicker": + this.addColorPicker(tool); + break; + case "altText": + await this.addAltText(tool); + break; + case "editSignature": + await this.addEditSignatureButton(tool); + break; + case "delete": + this.addDeleteButton(); + break; + case "comment": + this.addComment(tool); + break; + } + } + async addButtonBefore(name, tool, beforeSelector) { + const beforeElement = this.#buttons.querySelector(beforeSelector); + if (!beforeElement) { + return; + } + if (name === "comment") { + this.addComment(tool, beforeElement); + } + } + updateEditSignatureButton(description) { + if (this.#signatureDescriptionButton) { + this.#signatureDescriptionButton.title = description; + } + } + remove() { + this.#toolbar.remove(); + this.#colorPicker?.destroy(); + this.#colorPicker = null; + } +} +class FloatingToolbar { + #buttons = null; + #toolbar = null; + #uiManager; + constructor(uiManager) { + this.#uiManager = uiManager; + } + #render() { + const editToolbar = this.#toolbar = document.createElement("div"); + editToolbar.className = "editToolbar"; + editToolbar.setAttribute("role", "toolbar"); + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + editToolbar.addEventListener("contextmenu", noContextMenu, { + signal + }); + } + const buttons = this.#buttons = document.createElement("div"); + buttons.className = "buttons"; + editToolbar.append(buttons); + if (this.#uiManager.hasCommentManager()) { + this.#makeButton("commentButton", `pdfjs-comment-floating-button`, "pdfjs-comment-floating-button-label", () => { + this.#uiManager.commentSelection("floating_button"); + }); + } + this.#makeButton("highlightButton", `pdfjs-highlight-floating-button1`, "pdfjs-highlight-floating-button-label", () => { + this.#uiManager.highlightSelection("floating_button"); + }); + return editToolbar; + } + #getLastPoint(boxes, isLTR) { + let lastY = 0; + let lastX = 0; + for (const box of boxes) { + const y = box.y + box.height; + if (y < lastY) { + continue; + } + const x = box.x + (isLTR ? box.width : 0); + if (y > lastY) { + lastX = x; + lastY = y; + continue; + } + if (isLTR) { + if (x > lastX) { + lastX = x; + } + } else if (x < lastX) { + lastX = x; + } + } + return [isLTR ? 1 - lastX : lastX, lastY]; + } + show(parent, boxes, isLTR) { + const [x, y] = this.#getLastPoint(boxes, isLTR); + const { + style + } = this.#toolbar ||= this.#render(); + parent.append(this.#toolbar); + style.insetInlineEnd = `${100 * x}%`; + style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`; + } + hide() { + this.#toolbar.remove(); + } + #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) { + const button = document.createElement("button"); + button.classList.add("basic", buttonClass); + button.tabIndex = 0; + button.setAttribute("data-l10n-id", l10nId); + const span = document.createElement("span"); + button.append(span); + span.className = "visuallyHidden"; + span.setAttribute("data-l10n-id", labelL10nId); + const signal = this.#uiManager._signal; + if (signal instanceof AbortSignal && !signal.aborted) { + button.addEventListener("contextmenu", noContextMenu, { + signal + }); + button.addEventListener("click", clickHandler, { + signal + }); + } + this.#buttons.append(button); + } +} + +;// ./src/display/editor/tools.js + + + +function bindEvents(obj, element, names) { + for (const name of names) { + element.addEventListener(name, obj[name].bind(obj)); + } +} +class IdManager { + #id = 0; + get id() { + return `${AnnotationEditorPrefix}${this.#id++}`; + } +} +class ImageManager { + #baseId = getUuid(); + #id = 0; + #cache = null; + static get _isSVGFittingCanvas() { + const svg = `data:image/svg+xml;charset=UTF-8,`; + const canvas = new OffscreenCanvas(1, 3); + const ctx = canvas.getContext("2d", { + willReadFrequently: true + }); + const image = new Image(); + image.src = svg; + const promise = image.decode().then(() => { + ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3); + return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0; + }); + return shadow(this, "_isSVGFittingCanvas", promise); + } + async #get(key, rawData) { + this.#cache ||= new Map(); + let data = this.#cache.get(key); + if (data === null) { + return null; + } + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + try { + data ||= { + bitmap: null, + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 0, + isSvg: false + }; + let image; + if (typeof rawData === "string") { + data.url = rawData; + image = await fetchData(rawData, "blob"); + } else if (rawData instanceof File) { + image = data.file = rawData; + } else if (rawData instanceof Blob) { + image = rawData; + } + if (image.type === "image/svg+xml") { + const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas; + const fileReader = new FileReader(); + const imageElement = new Image(); + const imagePromise = new Promise((resolve, reject) => { + imageElement.onload = () => { + data.bitmap = imageElement; + data.isSvg = true; + resolve(); + }; + fileReader.onload = async () => { + const url = data.svgUrl = fileReader.result; + imageElement.src = (await mustRemoveAspectRatioPromise) ? `${url}#svgView(preserveAspectRatio(none))` : url; + }; + imageElement.onerror = fileReader.onerror = reject; + }); + fileReader.readAsDataURL(image); + await imagePromise; + } else { + data.bitmap = await createImageBitmap(image); + } + data.refCounter = 1; + } catch (e) { + warn(e); + data = null; + } + this.#cache.set(key, data); + if (data) { + this.#cache.set(data.id, data); + } + return data; + } + async getFromFile(file) { + const { + lastModified, + name, + size, + type + } = file; + return this.#get(`${lastModified}_${name}_${size}_${type}`, file); + } + async getFromUrl(url) { + return this.#get(url, url); + } + async getFromBlob(id, blobPromise) { + const blob = await blobPromise; + return this.#get(id, blob); + } + async getFromId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return null; + } + if (data.bitmap) { + data.refCounter += 1; + return data; + } + if (data.file) { + return this.getFromFile(data.file); + } + if (data.blobPromise) { + const { + blobPromise + } = data; + delete data.blobPromise; + return this.getFromBlob(data.id, blobPromise); + } + return this.getFromUrl(data.url); + } + getFromCanvas(id, canvas) { + this.#cache ||= new Map(); + let data = this.#cache.get(id); + if (data?.bitmap) { + data.refCounter += 1; + return data; + } + const offscreen = new OffscreenCanvas(canvas.width, canvas.height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(canvas, 0, 0); + data = { + bitmap: offscreen.transferToImageBitmap(), + id: `image_${this.#baseId}_${this.#id++}`, + refCounter: 1, + isSvg: false + }; + this.#cache.set(id, data); + this.#cache.set(data.id, data); + return data; + } + getSvgUrl(id) { + const data = this.#cache.get(id); + if (!data?.isSvg) { + return null; + } + return data.svgUrl; + } + deleteId(id) { + this.#cache ||= new Map(); + const data = this.#cache.get(id); + if (!data) { + return; + } + data.refCounter -= 1; + if (data.refCounter !== 0) { + return; + } + const { + bitmap + } = data; + if (!data.url && !data.file) { + const canvas = new OffscreenCanvas(bitmap.width, bitmap.height); + const ctx = canvas.getContext("bitmaprenderer"); + ctx.transferFromImageBitmap(bitmap); + data.blobPromise = canvas.convertToBlob(); + } + bitmap.close?.(); + data.bitmap = null; + } + isValidId(id) { + return id.startsWith(`image_${this.#baseId}_`); + } +} +class CommandManager { + #commands = []; + #locked = false; + #maxSize; + #position = -1; + constructor(maxSize = 128) { + this.#maxSize = maxSize; + } + add({ + cmd, + undo, + post, + mustExec, + type = NaN, + overwriteIfSameType = false, + keepUndo = false + }) { + if (mustExec) { + cmd(); + } + if (this.#locked) { + return; + } + const save = { + cmd, + undo, + post, + 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; + const { + undo, + post + } = this.#commands[this.#position]; + undo(); + post?.(); + this.#locked = false; + this.#position -= 1; + } + redo() { + if (this.#position < this.#commands.length - 1) { + this.#position += 1; + this.#locked = true; + const { + cmd, + post + } = this.#commands[this.#position]; + cmd(); + post?.(); + this.#locked = false; + } + } + hasSomethingToUndo() { + return this.#position !== -1; + } + hasSomethingToRedo() { + return this.#position < this.#commands.length - 1; + } + cleanType(type) { + if (this.#position === -1) { + return; + } + for (let i = this.#position; i >= 0; i--) { + if (this.#commands[i].type !== type) { + this.#commands.splice(i + 1, this.#position - i); + this.#position = i; + return; + } + } + this.#commands.length = 0; + this.#position = -1; + } + destroy() { + this.#commands = null; + } +} +class KeyboardManager { + constructor(callbacks) { + this.buffer = []; + this.callbacks = new Map(); + this.allKeys = new Set(); + const { + isMac + } = util_FeatureTest.platform; + for (const [keys, callback, options = {}] of callbacks) { + for (const key of keys) { + const isMacKey = key.startsWith("mac+"); + if (isMac && isMacKey) { + this.callbacks.set(key.slice(4), { + callback, + options + }); + this.allKeys.add(key.split("+").at(-1)); + } else if (!isMac && !isMacKey) { + this.callbacks.set(key, { + callback, + options + }); + 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 info = this.callbacks.get(this.#serialize(event)); + if (!info) { + return; + } + const { + callback, + options: { + bubbles = false, + args = [], + checker = null + } + } = info; + if (checker && !checker(self, event)) { + return; + } + callback.bind(self, ...args, event)(); + if (!bubbles) { + stopEvent(event); + } + } +} +class ColorManager { + static _colorsMapping = new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]); + get _colors() { + const colors = new Map([["CanvasText", null], ["Canvas", null]]); + getColorValues(colors); + return shadow(this, "_colors", colors); + } + convert(color) { + const rgb = 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.makeHexColor(...rgb); + } +} +class AnnotationEditorUIManager { + #abortController = new AbortController(); + #activeEditor = null; + #allEditableAnnotations = null; + #allEditors = new Map(); + #allLayers = new Map(); + #altTextManager = null; + #annotationStorage = null; + #changedExistingAnnotations = null; + #commandManager = new CommandManager(); + #commentManager = null; + #copyPasteAC = null; + #currentDrawingSession = null; + #currentPageIndex = 0; + #deletedAnnotationsElementIds = new Set(); + #draggingEditors = null; + #editorTypes = null; + #editorsToRescale = new Set(); + _editorUndoBar = null; + #enableHighlightFloatingButton = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #filterFactory = null; + #focusMainContainerTimeoutId = null; + #focusManagerAC = null; + #highlightColors = null; + #highlightWhenShiftUp = false; + #floatingToolbar = null; + #idManager = new IdManager(); + #isEnabled = false; + #isPointerDown = false; + #isWaiting = false; + #keyboardManagerAC = null; + #lastActiveElement = null; + #mainHighlightColorPicker = null; + #missingCanvases = null; + #mlManager = null; + #mode = AnnotationEditorType.NONE; + #selectedEditors = new Set(); + #selectedTextNode = null; + #signatureManager = null; + #pageColors = null; + #showAllStates = null; + #pdfDocument = null; + #previousStates = { + isEditing: false, + isEmpty: true, + hasSomethingToUndo: false, + hasSomethingToRedo: false, + hasSelectedEditor: false, + hasSelectedText: false + }; + #translation = [0, 0]; + #translationTimeoutId = null; + #container = null; + #viewer = null; + #viewerAlert = null; + #updateModeCapability = null; + static TRANSLATE_SMALL = 1; + static TRANSLATE_BIG = 10; + static get _keyboardManager() { + const proto = AnnotationEditorUIManager.prototype; + const arrowChecker = self => self.#container.contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl(); + const textInputChecker = (_self, { + target: el + }) => { + if (el instanceof HTMLInputElement) { + const { + type + } = el; + return type !== "text" && type !== "number"; + } + return true; + }; + const small = this.TRANSLATE_SMALL; + const big = this.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, { + checker: textInputChecker + }], [["ctrl+z", "mac+meta+z"], proto.undo, { + checker: textInputChecker + }], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, { + checker: textInputChecker + }], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, { + checker: textInputChecker + }], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(el) && !self.isEnterHandled + }], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, { + checker: (self, { + target: el + }) => !(el instanceof HTMLButtonElement) && self.#container.contains(document.activeElement) + }], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, { + args: [0, big], + checker: arrowChecker + }]])); + } + constructor(container, viewer, viewerAlert, altTextManager, commentManager, signatureManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager, editorUndoBar, supportsPinchToZoom) { + const signal = this._signal = this.#abortController.signal; + this.#container = container; + this.#viewer = viewer; + this.#viewerAlert = viewerAlert; + this.#altTextManager = altTextManager; + this.#commentManager = commentManager; + this.#signatureManager = signatureManager; + this.#pdfDocument = pdfDocument; + this._eventBus = eventBus; + eventBus._on("editingaction", this.onEditingAction.bind(this), { + signal + }); + eventBus._on("pagechanging", this.onPageChanging.bind(this), { + signal + }); + eventBus._on("scalechanging", this.onScaleChanging.bind(this), { + signal + }); + eventBus._on("rotationchanging", this.onRotationChanging.bind(this), { + signal + }); + eventBus._on("setpreference", this.onSetPreference.bind(this), { + signal + }); + eventBus._on("switchannotationeditorparams", evt => this.updateParams(evt.type, evt.value), { + signal + }); + window.addEventListener("pointerdown", () => { + this.#isPointerDown = true; + }, { + capture: true, + signal + }); + window.addEventListener("pointerup", () => { + this.#isPointerDown = false; + }, { + capture: true, + signal + }); + this.#addSelectionListener(); + this.#addDragAndDropListeners(); + this.#addKeyboardManager(); + this.#annotationStorage = pdfDocument.annotationStorage; + this.#filterFactory = pdfDocument.filterFactory; + this.#pageColors = pageColors; + this.#highlightColors = highlightColors || null; + this.#enableHighlightFloatingButton = enableHighlightFloatingButton; + this.#enableUpdatedAddImage = enableUpdatedAddImage; + this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage; + this.#mlManager = mlManager || null; + this.viewParameters = { + realScale: PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: 0 + }; + this.isShiftKeyDown = false; + this._editorUndoBar = editorUndoBar || null; + this._supportsPinchToZoom = supportsPinchToZoom !== false; + commentManager?.setSidebarUiManager(this); + } + destroy() { + this.#updateModeCapability?.resolve(); + this.#updateModeCapability = null; + this.#abortController?.abort(); + this.#abortController = null; + this._signal = null; + for (const layer of this.#allLayers.values()) { + layer.destroy(); + } + this.#allLayers.clear(); + this.#allEditors.clear(); + this.#editorsToRescale.clear(); + this.#missingCanvases?.clear(); + this.#activeEditor = null; + this.#selectedEditors.clear(); + this.#commandManager.destroy(); + this.#altTextManager?.destroy(); + this.#commentManager?.destroy(); + this.#signatureManager?.destroy(); + this.#floatingToolbar?.hide(); + this.#floatingToolbar = null; + this.#mainHighlightColorPicker?.destroy(); + this.#mainHighlightColorPicker = null; + this.#allEditableAnnotations = null; + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + this.#focusMainContainerTimeoutId = null; + } + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + this.#translationTimeoutId = null; + } + this._editorUndoBar?.destroy(); + this.#pdfDocument = null; + } + combinedSignal(ac) { + return AbortSignal.any([this._signal, ac.signal]); + } + get mlManager() { + return this.#mlManager; + } + get useNewAltTextFlow() { + return this.#enableUpdatedAddImage; + } + get useNewAltTextWhenAddingImage() { + return this.#enableNewAltTextWhenAddingImage; + } + get hcmFilter() { + return shadow(this, "hcmFilter", this.#pageColors ? this.#filterFactory.addHCMFilter(this.#pageColors.foreground, this.#pageColors.background) : "none"); + } + get direction() { + return shadow(this, "direction", getComputedStyle(this.#container).direction); + } + get _highlightColors() { + return shadow(this, "_highlightColors", this.#highlightColors ? new Map(this.#highlightColors.split(",").map(pair => { + pair = pair.split("=").map(x => x.trim()); + pair[1] = pair[1].toUpperCase(); + return pair; + })) : null); + } + get highlightColors() { + const { + _highlightColors + } = this; + if (!_highlightColors) { + return shadow(this, "highlightColors", null); + } + const map = new Map(); + const hasHCM = !!this.#pageColors; + for (const [name, color] of _highlightColors) { + const isNameForHCM = name.endsWith("_HCM"); + if (hasHCM && isNameForHCM) { + map.set(name.replace("_HCM", ""), color); + continue; + } + if (!hasHCM && !isNameForHCM) { + map.set(name, color); + } + } + return shadow(this, "highlightColors", map); + } + get highlightColorNames() { + return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, e => e.reverse())) : null); + } + getNonHCMColor(color) { + if (!this._highlightColors) { + return color; + } + const colorName = this.highlightColorNames.get(color); + return this._highlightColors.get(colorName) || color; + } + getNonHCMColorName(color) { + return this.highlightColorNames.get(color) || color; + } + setCurrentDrawingSession(layer) { + if (layer) { + this.unselectAll(); + this.disableUserSelect(true); + } else { + this.disableUserSelect(false); + } + this.#currentDrawingSession = layer; + } + setMainHighlightColorPicker(colorPicker) { + this.#mainHighlightColorPicker = colorPicker; + } + editAltText(editor, firstTime = false) { + this.#altTextManager?.editAltText(this, editor, firstTime); + } + hasCommentManager() { + return !!this.#commentManager; + } + editComment(editor, posX, posY, options) { + this.#commentManager?.showDialog(this, editor, posX, posY, options); + } + selectComment(pageIndex, uid) { + const layer = this.#allLayers.get(pageIndex); + const editor = layer?.getEditorByUID(uid); + editor?.toggleComment(true, true); + } + updateComment(editor) { + this.#commentManager?.updateComment(editor.getData()); + } + updatePopupColor(editor) { + this.#commentManager?.updatePopupColor(editor); + } + removeComment(editor) { + this.#commentManager?.removeComments([editor.uid]); + } + toggleComment(editor, isSelected, visibility = undefined) { + this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility); + } + makeCommentColor(color, opacity) { + return color && this.#commentManager?.makeCommentColor(color, opacity) || null; + } + getCommentDialogElement() { + return this.#commentManager?.dialogElement || null; + } + async waitForEditorsRendered(pageNumber) { + if (this.#allLayers.has(pageNumber - 1)) { + return; + } + const { + resolve, + promise + } = Promise.withResolvers(); + const onEditorsRendered = evt => { + if (evt.pageNumber === pageNumber) { + this._eventBus._off("editorsrendered", onEditorsRendered); + resolve(); + } + }; + this._eventBus.on("editorsrendered", onEditorsRendered); + await promise; + } + getSignature(editor) { + this.#signatureManager?.getSignature({ + uiManager: this, + editor + }); + } + get signatureManager() { + return this.#signatureManager; + } + switchToMode(mode, callback) { + this._eventBus.on("annotationeditormodechanged", callback, { + once: true, + signal: this._signal + }); + this._eventBus.dispatch("showannotationeditorui", { + source: this, + mode + }); + } + setPreference(name, value) { + this._eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + onSetPreference({ + name, + value + }) { + switch (name) { + case "enableNewAltTextWhenAddingImage": + this.#enableNewAltTextWhenAddingImage = value; + break; + } + } + onPageChanging({ + pageNumber + }) { + this.#currentPageIndex = pageNumber - 1; + } + focusMainContainer() { + this.#container.focus(); + } + findParent(x, y) { + for (const layer of this.#allLayers.values()) { + const { + x: layerX, + y: layerY, + width, + height + } = layer.div.getBoundingClientRect(); + if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) { + return layer; + } + } + return null; + } + disableUserSelect(value = false) { + this.#viewer.classList.toggle("noUserSelect", value); + } + addShouldRescale(editor) { + this.#editorsToRescale.add(editor); + } + removeShouldRescale(editor) { + this.#editorsToRescale.delete(editor); + } + onScaleChanging({ + scale + }) { + this.commitOrRemove(); + this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS; + for (const editor of this.#editorsToRescale) { + editor.onScaleChanging(); + } + this.#currentDrawingSession?.onScaleChanging(); + } + onRotationChanging({ + pagesRotation + }) { + this.commitOrRemove(); + this.viewParameters.rotation = pagesRotation; + } + #getAnchorElementForSelection({ + anchorNode + }) { + return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode; + } + #getLayerForTextLayer(textLayer) { + const { + currentLayer + } = this; + if (currentLayer.hasTextLayer(textLayer)) { + return currentLayer; + } + for (const layer of this.#allLayers.values()) { + if (layer.hasTextLayer(textLayer)) { + return layer; + } + } + return null; + } + highlightSelection(methodOfCreation = "", comment = false) { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const { + anchorNode, + anchorOffset, + focusNode, + focusOffset + } = selection; + const text = selection.toString(); + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + selection.empty(); + const layer = this.#getLayerForTextLayer(textLayer); + const isNoneMode = this.#mode === AnnotationEditorType.NONE; + const callback = () => { + const editor = layer?.createAndAddNewEditor({ + x: 0, + y: 0 + }, false, { + methodOfCreation, + boxes, + anchorNode, + anchorOffset, + focusNode, + focusOffset, + text + }); + if (isNoneMode) { + this.showAllEditors("highlight", true, true); + } + if (comment) { + editor?.editComment(); + } + }; + if (isNoneMode) { + this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback); + return; + } + callback(); + } + commentSelection(methodOfCreation = "") { + this.highlightSelection(methodOfCreation, true); + } + #displayFloatingToolbar() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + const boxes = this.getSelectionBoxes(textLayer); + if (!boxes) { + return; + } + this.#floatingToolbar ||= new FloatingToolbar(this); + this.#floatingToolbar.show(textLayer, boxes, this.direction === "ltr"); + } + getAndRemoveDataFromAnnotationStorage(annotationId) { + if (!this.#annotationStorage) { + return null; + } + const key = `${AnnotationEditorPrefix}${annotationId}`; + const storedValue = this.#annotationStorage.getRawValue(key); + if (storedValue) { + this.#annotationStorage.remove(key); + } + return storedValue; + } + addToAnnotationStorage(editor) { + if (!editor.isEmpty() && this.#annotationStorage && !this.#annotationStorage.has(editor.id)) { + this.#annotationStorage.setValue(editor.id, editor); + } + } + a11yAlert(messageId, args = null) { + const viewerAlert = this.#viewerAlert; + if (!viewerAlert) { + return; + } + viewerAlert.setAttribute("data-l10n-id", messageId); + if (args) { + viewerAlert.setAttribute("data-l10n-args", JSON.stringify(args)); + } else { + viewerAlert.removeAttribute("data-l10n-args"); + } + } + #selectionChange() { + const selection = document.getSelection(); + if (!selection || selection.isCollapsed) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + const { + anchorNode + } = selection; + if (anchorNode === this.#selectedTextNode) { + return; + } + const anchorElement = this.#getAnchorElementForSelection(selection); + const textLayer = anchorElement.closest(".textLayer"); + if (!textLayer) { + if (this.#selectedTextNode) { + this.#floatingToolbar?.hide(); + this.#selectedTextNode = null; + this.#dispatchUpdateStates({ + hasSelectedText: false + }); + } + return; + } + this.#floatingToolbar?.hide(); + this.#selectedTextNode = anchorNode; + this.#dispatchUpdateStates({ + hasSelectedText: true + }); + if (this.#mode !== AnnotationEditorType.HIGHLIGHT && this.#mode !== AnnotationEditorType.NONE) { + return; + } + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.showAllEditors("highlight", true, true); + } + this.#highlightWhenShiftUp = this.isShiftKeyDown; + if (!this.isShiftKeyDown) { + const activeLayer = this.#mode === AnnotationEditorType.HIGHLIGHT ? this.#getLayerForTextLayer(textLayer) : null; + activeLayer?.toggleDrawing(); + if (this.#isPointerDown) { + const ac = new AbortController(); + const signal = this.combinedSignal(ac); + const pointerup = e => { + if (e.type === "pointerup" && e.button !== 0) { + return; + } + ac.abort(); + activeLayer?.toggleDrawing(true); + if (e.type === "pointerup") { + this.#onSelectEnd("main_toolbar"); + } + }; + window.addEventListener("pointerup", pointerup, { + signal + }); + window.addEventListener("blur", pointerup, { + signal + }); + } else { + activeLayer?.toggleDrawing(true); + this.#onSelectEnd("main_toolbar"); + } + } + } + #onSelectEnd(methodOfCreation = "") { + if (this.#mode === AnnotationEditorType.HIGHLIGHT) { + this.highlightSelection(methodOfCreation); + } else if (this.#enableHighlightFloatingButton) { + this.#displayFloatingToolbar(); + } + } + #addSelectionListener() { + document.addEventListener("selectionchange", this.#selectionChange.bind(this), { + signal: this._signal + }); + } + #addFocusManager() { + if (this.#focusManagerAC) { + return; + } + this.#focusManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#focusManagerAC); + window.addEventListener("focus", this.focus.bind(this), { + signal + }); + window.addEventListener("blur", this.blur.bind(this), { + signal + }); + } + #removeFocusManager() { + this.#focusManagerAC?.abort(); + this.#focusManagerAC = null; + } + blur() { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + if (!this.hasSelection) { + return; + } + const { + activeElement + } = document; + for (const editor of this.#selectedEditors) { + if (editor.div.contains(activeElement)) { + this.#lastActiveElement = [editor, activeElement]; + editor._focusEventsAllowed = false; + break; + } + } + } + focus() { + if (!this.#lastActiveElement) { + return; + } + const [lastEditor, lastActiveElement] = this.#lastActiveElement; + this.#lastActiveElement = null; + lastActiveElement.addEventListener("focusin", () => { + lastEditor._focusEventsAllowed = true; + }, { + once: true, + signal: this._signal + }); + lastActiveElement.focus(); + } + #addKeyboardManager() { + if (this.#keyboardManagerAC) { + return; + } + this.#keyboardManagerAC = new AbortController(); + const signal = this.combinedSignal(this.#keyboardManagerAC); + window.addEventListener("keydown", this.keydown.bind(this), { + signal + }); + window.addEventListener("keyup", this.keyup.bind(this), { + signal + }); + } + #removeKeyboardManager() { + this.#keyboardManagerAC?.abort(); + this.#keyboardManagerAC = null; + } + #addCopyPasteListeners() { + if (this.#copyPasteAC) { + return; + } + this.#copyPasteAC = new AbortController(); + const signal = this.combinedSignal(this.#copyPasteAC); + document.addEventListener("copy", this.copy.bind(this), { + signal + }); + document.addEventListener("cut", this.cut.bind(this), { + signal + }); + document.addEventListener("paste", this.paste.bind(this), { + signal + }); + } + #removeCopyPasteListeners() { + this.#copyPasteAC?.abort(); + this.#copyPasteAC = null; + } + #addDragAndDropListeners() { + const signal = this._signal; + document.addEventListener("dragover", this.dragOver.bind(this), { + signal + }); + document.addEventListener("drop", this.drop.bind(this), { + signal + }); + } + addEditListeners() { + this.#addKeyboardManager(); + this.#addCopyPasteListeners(); + } + removeEditListeners() { + this.#removeKeyboardManager(); + this.#removeCopyPasteListeners(); + } + dragOver(event) { + for (const { + type + } of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(type)) { + event.dataTransfer.dropEffect = "copy"; + event.preventDefault(); + return; + } + } + } + } + drop(event) { + for (const item of event.dataTransfer.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + event.preventDefault(); + return; + } + } + } + } + copy(event) { + event.preventDefault(); + this.#activeEditor?.commitOrRemove(); + if (!this.hasSelection) { + return; + } + const editors = []; + for (const editor of this.#selectedEditors) { + const serialized = editor.serialize(true); + if (serialized) { + editors.push(serialized); + } + } + if (editors.length === 0) { + return; + } + event.clipboardData.setData("application/pdfjs", JSON.stringify(editors)); + } + cut(event) { + this.copy(event); + this.delete(); + } + async paste(event) { + event.preventDefault(); + const { + clipboardData + } = event; + for (const item of clipboardData.items) { + for (const editorType of this.#editorTypes) { + if (editorType.isHandlingMimeForPasting(item.type)) { + editorType.paste(item, this.currentLayer); + return; + } + } + } + let data = clipboardData.getData("application/pdfjs"); + if (!data) { + return; + } + try { + data = JSON.parse(data); + } catch (ex) { + warn(`paste: "${ex.message}".`); + return; + } + if (!Array.isArray(data)) { + return; + } + this.unselectAll(); + const layer = this.currentLayer; + try { + const newEditors = []; + for (const editor of data) { + const deserializedEditor = await 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) { + warn(`paste: "${ex.message}".`); + } + } + keydown(event) { + if (!this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = true; + } + if (this.#mode !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) { + AnnotationEditorUIManager._keyboardManager.exec(this, event); + } + } + keyup(event) { + if (this.isShiftKeyDown && event.key === "Shift") { + this.isShiftKeyDown = false; + if (this.#highlightWhenShiftUp) { + this.#highlightWhenShiftUp = false; + this.#onSelectEnd("main_toolbar"); + } + } + } + onEditingAction({ + name + }) { + switch (name) { + case "undo": + case "redo": + case "delete": + case "selectAll": + this[name](); + break; + case "highlightSelection": + this.highlightSelection("context_menu"); + break; + case "commentSelection": + this.commentSelection("context_menu"); + break; + } + } + #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) + }); + if (this.#mode === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]); + } + } + } + #dispatchUpdateUI(details) { + this._eventBus.dispatch("annotationeditorparamschanged", { + source: this, + details + }); + } + setEditingState(isEditing) { + if (isEditing) { + this.#addFocusManager(); + this.#addCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: this.#mode !== AnnotationEditorType.NONE, + isEmpty: this.#isEmpty(), + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(), + hasSelectedEditor: false + }); + } else { + this.#removeFocusManager(); + this.#removeCopyPasteListeners(); + this.#dispatchUpdateStates({ + isEditing: false + }); + this.disableUserSelect(false); + } + } + registerEditorTypes(types) { + if (this.#editorTypes) { + return; + } + this.#editorTypes = types; + for (const editorType of this.#editorTypes) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + } + getId() { + return this.#idManager.id; + } + get currentLayer() { + return this.#allLayers.get(this.#currentPageIndex); + } + getLayer(pageIndex) { + return this.#allLayers.get(pageIndex); + } + 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); + } + async updateMode(mode, editId = null, isFromKeyboard = false, mustEnterInEditMode = false, editComment = false) { + if (this.#mode === mode) { + return; + } + if (this.#updateModeCapability) { + await this.#updateModeCapability.promise; + if (!this.#updateModeCapability) { + return; + } + } + this.#updateModeCapability = Promise.withResolvers(); + this.#currentDrawingSession?.commitOrRemove(); + if (this.#mode === AnnotationEditorType.POPUP) { + this.#commentManager?.hideSidebar(); + } + this.#commentManager?.destroyPopup(); + this.#mode = mode; + if (mode === AnnotationEditorType.NONE) { + this.setEditingState(false); + this.#disableAll(); + for (const editor of this.#allEditors.values()) { + editor.hideStandaloneCommentButton(); + } + this._editorUndoBar?.hide(); + this.toggleComment(null); + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + editor.addStandaloneCommentButton(); + } + if (mode === AnnotationEditorType.SIGNATURE) { + await this.#signatureManager?.loadSignatures(); + } + this.setEditingState(true); + await this.#enableAll(); + this.unselectAll(); + for (const layer of this.#allLayers.values()) { + layer.updateMode(mode); + } + if (mode === AnnotationEditorType.POPUP) { + this.#allEditableAnnotations ||= await this.#pdfDocument.getAnnotationsByType(new Set(this.#editorTypes.map(editorClass => editorClass._editorType))); + const elementIds = new Set(); + const allComments = []; + for (const editor of this.#allEditors.values()) { + const { + annotationElementId, + hasComment, + deleted + } = editor; + if (annotationElementId) { + elementIds.add(annotationElementId); + } + if (hasComment && !deleted) { + allComments.push(editor.getData()); + } + } + for (const annotation of this.#allEditableAnnotations) { + const { + id, + popupRef, + contentsObj + } = annotation; + if (popupRef && contentsObj?.str && !elementIds.has(id) && !this.#deletedAnnotationsElementIds.has(id)) { + allComments.push(annotation); + } + } + this.#commentManager?.showSidebar(allComments); + } + if (!editId) { + if (isFromKeyboard) { + this.addNewEditorFromKeyboard(); + } + this.#updateModeCapability.resolve(); + return; + } + for (const editor of this.#allEditors.values()) { + if (editor.uid === editId) { + this.setSelected(editor); + if (editComment) { + editor.editComment(); + } else if (mustEnterInEditMode) { + editor.enterInEditMode(); + } else { + editor.focus(); + } + } else { + editor.unselect(); + } + } + this.#updateModeCapability.resolve(); + } + addNewEditorFromKeyboard() { + if (this.currentLayer.canCreateNewEmptyEditor()) { + this.currentLayer.addNewEditor(); + } + } + updateToolbar(options) { + if (options.mode === this.#mode) { + return; + } + this._eventBus.dispatch("switchannotationeditormode", { + source: this, + ...options + }); + } + updateParams(type, value) { + if (!this.#editorTypes) { + return; + } + switch (type) { + case AnnotationEditorParamsType.CREATE: + this.currentLayer.addNewEditor(value); + return; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + this._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + type: "highlight", + action: "toggle_visibility" + } + } + }); + (this.#showAllStates ||= new Map()).set(type, value); + this.showAllEditors("highlight", value); + break; + } + if (this.hasSelection) { + for (const editor of this.#selectedEditors) { + editor.updateParams(type, value); + } + } else { + for (const editorType of this.#editorTypes) { + editorType.updateDefaultParams(type, value); + } + } + } + showAllEditors(type, visible, updateButton = false) { + for (const editor of this.#allEditors.values()) { + if (editor.editorType === type) { + editor.show(visible); + } + } + const state = this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ?? true; + if (state !== visible) { + this.#dispatchUpdateUI([[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]); + } + } + enableWaiting(mustWait = false) { + if (this.#isWaiting === mustWait) { + return; + } + this.#isWaiting = mustWait; + for (const layer of this.#allLayers.values()) { + if (mustWait) { + layer.disableClick(); + } else { + layer.enableClick(); + } + layer.div.classList.toggle("waiting", mustWait); + } + } + async #enableAll() { + if (!this.#isEnabled) { + this.#isEnabled = true; + const promises = []; + for (const layer of this.#allLayers.values()) { + promises.push(layer.enable()); + } + await Promise.all(promises); + for (const editor of this.#allEditors.values()) { + editor.enable(); + } + } + } + #disableAll() { + this.unselectAll(); + if (this.#isEnabled) { + this.#isEnabled = false; + for (const layer of this.#allLayers.values()) { + layer.disable(); + } + for (const editor of this.#allEditors.values()) { + editor.disable(); + } + } + } + *getEditors(pageIndex) { + for (const editor of this.#allEditors.values()) { + if (editor.pageIndex === pageIndex) { + yield editor; + } + } + } + getEditor(id) { + return this.#allEditors.get(id); + } + addEditor(editor) { + this.#allEditors.set(editor.id, editor); + } + removeEditor(editor) { + if (editor.div.contains(document.activeElement)) { + if (this.#focusMainContainerTimeoutId) { + clearTimeout(this.#focusMainContainerTimeoutId); + } + this.#focusMainContainerTimeoutId = setTimeout(() => { + this.focusMainContainer(); + this.#focusMainContainerTimeoutId = null; + }, 0); + } + this.#allEditors.delete(editor.id); + if (editor.annotationElementId) { + this.#missingCanvases?.delete(editor.annotationElementId); + } + this.unselect(editor); + if (!editor.annotationElementId || !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)) { + this.#annotationStorage?.remove(editor.id); + } + } + addDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.add(editor.annotationElementId); + this.addChangedExistingAnnotation(editor); + editor.deleted = true; + } + isDeletedAnnotationElement(annotationElementId) { + return this.#deletedAnnotationsElementIds.has(annotationElementId); + } + removeDeletedAnnotationElement(editor) { + this.#deletedAnnotationsElementIds.delete(editor.annotationElementId); + this.removeChangedExistingAnnotation(editor); + editor.deleted = false; + } + #addEditorToLayer(editor) { + const layer = this.#allLayers.get(editor.pageIndex); + if (layer) { + layer.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + } + } + setActiveEditor(editor) { + if (this.#activeEditor === editor) { + return; + } + this.#activeEditor = editor; + if (editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + get #lastSelectedEditor() { + let ed = null; + for (ed of this.#selectedEditors) {} + return ed; + } + updateUI(editor) { + if (this.#lastSelectedEditor === editor) { + this.#dispatchUpdateUI(editor.propertiesToUpdate); + } + } + updateUIForDefaultProperties(editorType) { + this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate); + } + 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) { + this.updateToolbar({ + mode: editor.mode, + editId: editor.id + }); + this.#currentDrawingSession?.commitOrRemove(); + 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); + } + get firstSelectedEditor() { + return this.#selectedEditors.values().next().value; + } + unselect(editor) { + editor.unselect(); + this.#selectedEditors.delete(editor); + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + get hasSelection() { + return this.#selectedEditors.size !== 0; + } + get isEnterHandled() { + return this.#selectedEditors.size === 1 && this.firstSelectedEditor.isEnterHandled; + } + undo() { + this.#commandManager.undo(); + this.#dispatchUpdateStates({ + hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(), + hasSomethingToRedo: true, + isEmpty: this.#isEmpty() + }); + this._editorUndoBar?.hide(); + } + 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() + }); + } + cleanUndoStack(type) { + this.#commandManager.cleanType(type); + } + #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(); + const drawingEditor = this.currentLayer?.endDrawingSession(true); + if (!this.hasSelection && !drawingEditor) { + return; + } + const editors = drawingEditor ? [drawingEditor] : [...this.#selectedEditors]; + const cmd = () => { + this._editorUndoBar?.show(undo, editors.length === 1 ? editors[0].editorType : editors.length); + 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(); + } + hasSomethingToControl() { + return this.#activeEditor || this.hasSelection; + } + #selectEditors(editors) { + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + for (const editor of editors) { + if (editor.isEmpty()) { + continue; + } + this.#selectedEditors.add(editor); + editor.select(); + } + this.#dispatchUpdateStates({ + hasSelectedEditor: this.hasSelection + }); + } + selectAll() { + for (const editor of this.#selectedEditors) { + editor.commit(); + } + this.#selectEditors(this.#allEditors.values()); + } + unselectAll() { + if (this.#activeEditor) { + this.#activeEditor.commitOrRemove(); + if (this.#mode !== AnnotationEditorType.NONE) { + return; + } + } + if (this.#currentDrawingSession?.commitOrRemove()) { + return; + } + if (!this.hasSelection) { + return; + } + for (const editor of this.#selectedEditors) { + editor.unselect(); + } + this.#selectedEditors.clear(); + this.#dispatchUpdateStates({ + hasSelectedEditor: false + }); + } + translateSelectedEditors(x, y, noCommit = false) { + if (!noCommit) { + this.commitOrRemove(); + } + if (!this.hasSelection) { + return; + } + this.#translation[0] += x; + this.#translation[1] += y; + const [totalX, totalY] = this.#translation; + const editors = [...this.#selectedEditors]; + const TIME_TO_WAIT = 1000; + if (this.#translationTimeoutId) { + clearTimeout(this.#translationTimeoutId); + } + this.#translationTimeoutId = setTimeout(() => { + this.#translationTimeoutId = null; + this.#translation[0] = this.#translation[1] = 0; + this.addCommands({ + cmd: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(totalX, totalY); + editor.translationDone(); + } + } + }, + undo: () => { + for (const editor of editors) { + if (this.#allEditors.has(editor.id)) { + editor.translateInPage(-totalX, -totalY); + editor.translationDone(); + } + } + }, + mustExec: false + }); + }, TIME_TO_WAIT); + for (const editor of editors) { + editor.translateInPage(x, y); + editor.translationDone(); + } + } + setUpDragSession() { + if (!this.hasSelection) { + return; + } + this.disableUserSelect(true); + this.#draggingEditors = new Map(); + for (const editor of this.#selectedEditors) { + this.#draggingEditors.set(editor, { + savedX: editor.x, + savedY: editor.y, + savedPageIndex: editor.pageIndex, + newX: 0, + newY: 0, + newPageIndex: -1 + }); + } + } + endDragSession() { + if (!this.#draggingEditors) { + return false; + } + this.disableUserSelect(false); + const map = this.#draggingEditors; + this.#draggingEditors = null; + let mustBeAddedInUndoStack = false; + for (const [{ + x, + y, + pageIndex + }, value] of map) { + value.newX = x; + value.newY = y; + value.newPageIndex = pageIndex; + mustBeAddedInUndoStack ||= x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex; + } + if (!mustBeAddedInUndoStack) { + return false; + } + const move = (editor, x, y, pageIndex) => { + if (this.#allEditors.has(editor.id)) { + const parent = this.#allLayers.get(pageIndex); + if (parent) { + editor._setParentAndPosition(parent, x, y); + } else { + editor.pageIndex = pageIndex; + editor.x = x; + editor.y = y; + } + } + }; + this.addCommands({ + cmd: () => { + for (const [editor, { + newX, + newY, + newPageIndex + }] of map) { + move(editor, newX, newY, newPageIndex); + } + }, + undo: () => { + for (const [editor, { + savedX, + savedY, + savedPageIndex + }] of map) { + move(editor, savedX, savedY, savedPageIndex); + } + }, + mustExec: true + }); + return true; + } + dragSelectedEditors(tx, ty) { + if (!this.#draggingEditors) { + return; + } + for (const editor of this.#draggingEditors.keys()) { + editor.drag(tx, ty); + } + } + rebuild(editor) { + if (editor.parent === null) { + const parent = this.getLayer(editor.pageIndex); + if (parent) { + parent.changeParent(editor); + parent.addOrRebuild(editor); + } else { + this.addEditor(editor); + this.addToAnnotationStorage(editor); + editor.rebuild(); + } + } else { + editor.parent.addOrRebuild(editor); + } + } + get isEditorHandlingKeyboard() { + return this.getActive()?.shouldGetKeyboardEvents() || this.#selectedEditors.size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents(); + } + isActive(editor) { + return this.#activeEditor === editor; + } + getActive() { + return this.#activeEditor; + } + getMode() { + return this.#mode; + } + isEditingMode() { + return this.#mode !== AnnotationEditorType.NONE; + } + get imageManager() { + return shadow(this, "imageManager", new ImageManager()); + } + getSelectionBoxes(textLayer) { + if (!textLayer) { + return null; + } + const selection = document.getSelection(); + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) { + return null; + } + } + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + let rotator; + switch (textLayer.getAttribute("data-main-rotation")) { + case "90": + rotator = (x, y, w, h) => ({ + x: (y - layerY) / parentHeight, + y: 1 - (x + w - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + case "180": + rotator = (x, y, w, h) => ({ + x: 1 - (x + w - layerX) / parentWidth, + y: 1 - (y + h - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + case "270": + rotator = (x, y, w, h) => ({ + x: 1 - (y + h - layerY) / parentHeight, + y: (x - layerX) / parentWidth, + width: h / parentHeight, + height: w / parentWidth + }); + break; + default: + rotator = (x, y, w, h) => ({ + x: (x - layerX) / parentWidth, + y: (y - layerY) / parentHeight, + width: w / parentWidth, + height: h / parentHeight + }); + break; + } + const boxes = []; + for (let i = 0, ii = selection.rangeCount; i < ii; i++) { + const range = selection.getRangeAt(i); + if (range.collapsed) { + continue; + } + for (const { + x, + y, + width, + height + } of range.getClientRects()) { + if (width === 0 || height === 0) { + continue; + } + boxes.push(rotator(x, y, width, height)); + } + } + return boxes.length === 0 ? null : boxes; + } + addChangedExistingAnnotation({ + annotationElementId, + id + }) { + (this.#changedExistingAnnotations ||= new Map()).set(annotationElementId, id); + } + removeChangedExistingAnnotation({ + annotationElementId + }) { + this.#changedExistingAnnotations?.delete(annotationElementId); + } + renderAnnotationElement(annotation) { + const editorId = this.#changedExistingAnnotations?.get(annotation.data.id); + if (!editorId) { + return; + } + const editor = this.#annotationStorage.getRawValue(editorId); + if (!editor) { + return; + } + if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) { + return; + } + editor.renderAnnotationElement(annotation); + } + setMissingCanvas(annotationId, annotationElementId, canvas) { + const editor = this.#missingCanvases?.get(annotationId); + if (!editor) { + return; + } + editor.setCanvas(annotationElementId, canvas); + this.#missingCanvases.delete(annotationId); + } + addMissingCanvas(annotationId, editor) { + (this.#missingCanvases ||= new Map()).set(annotationId, editor); + } +} + +;// ./src/display/editor/alt_text.js + +class AltText { + #altText = null; + #altTextDecorative = false; + #altTextButton = null; + #altTextButtonLabel = null; + #altTextTooltip = null; + #altTextTooltipTimeout = null; + #altTextWasFromKeyBoard = false; + #badge = null; + #editor = null; + #guessedText = null; + #textWithDisclaimer = null; + #useNewAltTextFlow = false; + static #l10nNewButton = null; + static _l10n = null; + constructor(editor) { + this.#editor = editor; + this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow; + AltText.#l10nNewButton ||= Object.freeze({ + added: "pdfjs-editor-new-alt-text-added-button", + "added-label": "pdfjs-editor-new-alt-text-added-button-label", + missing: "pdfjs-editor-new-alt-text-missing-button", + "missing-label": "pdfjs-editor-new-alt-text-missing-button-label", + review: "pdfjs-editor-new-alt-text-to-review-button", + "review-label": "pdfjs-editor-new-alt-text-to-review-button-label" + }); + } + static initialize(l10n) { + AltText._l10n ??= l10n; + } + async render() { + const altText = this.#altTextButton = document.createElement("button"); + altText.className = "altText"; + altText.tabIndex = "0"; + const label = this.#altTextButtonLabel = document.createElement("span"); + altText.append(label); + if (this.#useNewAltTextFlow) { + altText.classList.add("new"); + altText.setAttribute("data-l10n-id", AltText.#l10nNewButton.missing); + label.setAttribute("data-l10n-id", AltText.#l10nNewButton["missing-label"]); + } else { + altText.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button"); + label.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-button-label"); + } + const signal = this.#editor._uiManager._signal; + altText.addEventListener("contextmenu", noContextMenu, { + signal + }); + altText.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + this.#editor._uiManager.editAltText(this.#editor); + if (this.#useNewAltTextFlow) { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_clicked", + data: { + label: this.#label + } + }); + } + }; + altText.addEventListener("click", onClick, { + capture: true, + signal + }); + altText.addEventListener("keydown", event => { + if (event.target === altText && event.key === "Enter") { + this.#altTextWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + await this.#setState(); + return altText; + } + get #label() { + return this.#altText && "added" || this.#altText === null && this.guessedText && "review" || "missing"; + } + finish() { + if (!this.#altTextButton) { + return; + } + this.#altTextButton.focus({ + focusVisible: this.#altTextWasFromKeyBoard + }); + this.#altTextWasFromKeyBoard = false; + } + isEmpty() { + if (this.#useNewAltTextFlow) { + return this.#altText === null; + } + return !this.#altText && !this.#altTextDecorative; + } + hasData() { + if (this.#useNewAltTextFlow) { + return this.#altText !== null || !!this.#guessedText; + } + return this.isEmpty(); + } + get guessedText() { + return this.#guessedText; + } + async setGuessedText(guessedText) { + if (this.#altText !== null) { + return; + } + this.#guessedText = guessedText; + this.#textWithDisclaimer = await AltText._l10n.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer", { + generatedAltText: guessedText + }); + this.#setState(); + } + toggleAltTextBadge(visibility = false) { + if (!this.#useNewAltTextFlow || this.#altText) { + this.#badge?.remove(); + this.#badge = null; + return; + } + if (!this.#badge) { + const badge = this.#badge = document.createElement("div"); + badge.className = "noAltTextBadge"; + this.#editor.div.append(badge); + } + this.#badge.classList.toggle("hidden", !visibility); + } + serialize(isForCopying) { + let altText = this.#altText; + if (!isForCopying && this.#guessedText === altText) { + altText = this.#textWithDisclaimer; + } + return { + altText, + decorative: this.#altTextDecorative, + guessedText: this.#guessedText, + textWithDisclaimer: this.#textWithDisclaimer + }; + } + get data() { + return { + altText: this.#altText, + decorative: this.#altTextDecorative + }; + } + set data({ + altText, + decorative, + guessedText, + textWithDisclaimer, + cancel = false + }) { + if (guessedText) { + this.#guessedText = guessedText; + this.#textWithDisclaimer = textWithDisclaimer; + } + if (this.#altText === altText && this.#altTextDecorative === decorative) { + return; + } + if (!cancel) { + this.#altText = altText; + this.#altTextDecorative = decorative; + } + this.#setState(); + } + toggle(enabled = false) { + if (!this.#altTextButton) { + return; + } + if (!enabled && this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextButton.disabled = !enabled; + } + shown() { + this.#editor._reportTelemetry({ + action: "pdfjs.image.alt_text.image_status_label_displayed", + data: { + label: this.#label + } + }); + } + destroy() { + this.#altTextButton?.remove(); + this.#altTextButton = null; + this.#altTextButtonLabel = null; + this.#altTextTooltip = null; + this.#badge?.remove(); + this.#badge = null; + } + async #setState() { + const button = this.#altTextButton; + if (!button) { + return; + } + if (this.#useNewAltTextFlow) { + button.classList.toggle("done", !!this.#altText); + button.setAttribute("data-l10n-id", AltText.#l10nNewButton[this.#label]); + this.#altTextButtonLabel?.setAttribute("data-l10n-id", AltText.#l10nNewButton[`${this.#label}-label`]); + if (!this.#altText) { + this.#altTextTooltip?.remove(); + return; + } + } else { + if (!this.#altText && !this.#altTextDecorative) { + button.classList.remove("done"); + this.#altTextTooltip?.remove(); + return; + } + button.classList.add("done"); + button.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-edit-button"); + } + let tooltip = this.#altTextTooltip; + if (!tooltip) { + this.#altTextTooltip = tooltip = document.createElement("span"); + tooltip.className = "tooltip"; + tooltip.setAttribute("role", "tooltip"); + tooltip.id = `alt-text-tooltip-${this.#editor.id}`; + const DELAY_TO_SHOW_TOOLTIP = 100; + const signal = this.#editor._uiManager._signal; + signal.addEventListener("abort", () => { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + }, { + once: true + }); + button.addEventListener("mouseenter", () => { + this.#altTextTooltipTimeout = setTimeout(() => { + this.#altTextTooltipTimeout = null; + this.#altTextTooltip.classList.add("show"); + this.#editor._reportTelemetry({ + action: "alt_text_tooltip" + }); + }, DELAY_TO_SHOW_TOOLTIP); + }, { + signal + }); + button.addEventListener("mouseleave", () => { + if (this.#altTextTooltipTimeout) { + clearTimeout(this.#altTextTooltipTimeout); + this.#altTextTooltipTimeout = null; + } + this.#altTextTooltip?.classList.remove("show"); + }, { + signal + }); + } + if (this.#altTextDecorative) { + tooltip.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-decorative-tooltip"); + } else { + tooltip.removeAttribute("data-l10n-id"); + tooltip.textContent = this.#altText; + } + if (!tooltip.parentNode) { + button.append(tooltip); + } + const element = this.#editor.getElementForAltText(); + element?.setAttribute("aria-describedby", tooltip.id); + } +} + +;// ./src/display/editor/comment.js + +class Comment { + #commentStandaloneButton = null; + #commentToolbarButton = null; + #commentWasFromKeyBoard = false; + #editor = null; + #initialText = null; + #richText = null; + #text = null; + #date = null; + #deleted = false; + #popupPosition = null; + constructor(editor) { + this.#editor = editor; + } + renderForToolbar() { + const button = this.#commentToolbarButton = document.createElement("button"); + button.className = "comment"; + return this.#render(button, false); + } + renderForStandalone() { + const button = this.#commentStandaloneButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const position = this.#editor.commentButtonPosition; + if (position) { + const { + style + } = button; + style.insetInlineEnd = `calc(${100 * (this.#editor._uiManager.direction === "ltr" ? 1 - position[0] : position[0])}% - var(--comment-button-dim))`; + style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`; + const color = this.#editor.commentButtonColor; + if (color) { + style.backgroundColor = color; + } + } + return this.#render(button, true); + } + focusButton() { + setTimeout(() => { + (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus(); + }, 0); + } + onUpdatedColor() { + if (!this.#commentStandaloneButton) { + return; + } + const color = this.#editor.commentButtonColor; + if (color) { + this.#commentStandaloneButton.style.backgroundColor = color; + } + this.#editor._uiManager.updatePopupColor(this.#editor); + } + get commentButtonWidth() { + return (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) / this.#editor.parent.boundingClientRect.width; + } + get commentPopupPositionInLayer() { + if (this.#popupPosition) { + return this.#popupPosition; + } + if (!this.#commentStandaloneButton) { + return null; + } + const { + x, + y, + height + } = this.#commentStandaloneButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#editor.parent.boundingClientRect; + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + set commentPopupPositionInLayer(pos) { + this.#popupPosition = pos; + } + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + removeStandaloneCommentButton() { + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + } + removeToolbarCommentButton() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentStandaloneButton) { + return; + } + this.#commentStandaloneButton.classList.toggle("selected", selected); + this.#commentStandaloneButton.ariaExpanded = hasPopup; + } + #render(comment, isStandalone) { + if (!this.#editor._uiManager.hasCommentManager()) { + return null; + } + comment.tabIndex = "0"; + comment.ariaHasPopup = "dialog"; + if (isStandalone) { + comment.ariaControls = "commentPopup"; + comment.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + } else { + comment.ariaControlsElements = [this.#editor._uiManager.getCommentDialogElement()]; + comment.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-button"); + } + const signal = this.#editor._uiManager._signal; + if (!(signal instanceof AbortSignal) || signal.aborted) { + return comment; + } + comment.addEventListener("contextmenu", noContextMenu, { + signal + }); + if (isStandalone) { + comment.addEventListener("focusin", e => { + this.#editor._focusEventsAllowed = false; + stopEvent(e); + }, { + capture: true, + signal + }); + comment.addEventListener("focusout", e => { + this.#editor._focusEventsAllowed = true; + stopEvent(e); + }, { + capture: true, + signal + }); + } + comment.addEventListener("pointerdown", event => event.stopPropagation(), { + signal + }); + const onClick = event => { + event.preventDefault(); + if (comment === this.#commentToolbarButton) { + this.edit(); + } else { + this.#editor.toggleComment(true); + } + }; + comment.addEventListener("click", onClick, { + capture: true, + signal + }); + comment.addEventListener("keydown", event => { + if (event.target === comment && event.key === "Enter") { + this.#commentWasFromKeyBoard = true; + onClick(event); + } + }, { + signal + }); + comment.addEventListener("pointerenter", () => { + this.#editor.toggleComment(false, true); + }, { + signal + }); + comment.addEventListener("pointerleave", () => { + this.#editor.toggleComment(false, false); + }, { + signal + }); + return comment; + } + edit(options) { + const position = this.commentPopupPositionInLayer; + let posX, posY; + if (position) { + [posX, posY] = position; + } else { + [posX, posY] = this.#editor.commentButtonPosition; + const { + width, + height, + x, + y + } = this.#editor; + posX = x + posX * width; + posY = y + posY * height; + } + const parentDimensions = this.#editor.parent.boundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#editor._uiManager.editComment(this.#editor, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions + }); + } + finish() { + if (!this.#commentToolbarButton) { + return; + } + this.#commentToolbarButton.focus({ + focusVisible: this.#commentWasFromKeyBoard + }); + this.#commentWasFromKeyBoard = false; + } + isDeleted() { + return this.#deleted || this.#text === ""; + } + isEmpty() { + return this.#text === null; + } + hasBeenEdited() { + return this.isDeleted() || this.#text !== this.#initialText; + } + serialize() { + return this.data; + } + get data() { + return { + text: this.#text, + richText: this.#richText, + date: this.#date, + deleted: this.isDeleted() + }; + } + set data(text) { + if (text !== this.#text) { + this.#richText = null; + } + if (text === null) { + this.#text = ""; + this.#deleted = true; + return; + } + this.#text = text; + this.#date = new Date(); + this.#deleted = false; + } + setInitialText(text, richText = null) { + this.#initialText = text; + this.data = text; + this.#date = null; + this.#richText = richText; + } + shown() {} + destroy() { + this.#commentToolbarButton?.remove(); + this.#commentToolbarButton = null; + this.#commentStandaloneButton?.remove(); + this.#commentStandaloneButton = null; + this.#text = ""; + this.#richText = null; + this.#date = null; + this.#editor = null; + this.#commentWasFromKeyBoard = false; + this.#deleted = false; + } +} + +;// ./src/display/touch_manager.js + +class TouchManager { + #container; + #isPinching = false; + #isPinchingStopped = null; + #isPinchingDisabled; + #onPinchStart; + #onPinching; + #onPinchEnd; + #pointerDownAC = null; + #signal; + #touchInfo = null; + #touchManagerAC; + #touchMoveAC = null; + constructor({ + container, + isPinchingDisabled = null, + isPinchingStopped = null, + onPinchStart = null, + onPinching = null, + onPinchEnd = null, + signal + }) { + this.#container = container; + this.#isPinchingStopped = isPinchingStopped; + this.#isPinchingDisabled = isPinchingDisabled; + this.#onPinchStart = onPinchStart; + this.#onPinching = onPinching; + this.#onPinchEnd = onPinchEnd; + this.#touchManagerAC = new AbortController(); + this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]); + container.addEventListener("touchstart", this.#onTouchStart.bind(this), { + passive: false, + signal: this.#signal + }); + } + get MIN_TOUCH_DISTANCE_TO_PINCH() { + return 35 / OutputScale.pixelRatio; + } + #onTouchStart(evt) { + if (this.#isPinchingDisabled?.()) { + return; + } + if (evt.touches.length === 1) { + if (this.#pointerDownAC) { + return; + } + const pointerDownAC = this.#pointerDownAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]); + const container = this.#container; + const opts = { + capture: true, + signal, + passive: false + }; + const cancelPointerDown = e => { + if (e.pointerType === "touch") { + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } + }; + container.addEventListener("pointerdown", e => { + if (e.pointerType === "touch") { + stopEvent(e); + cancelPointerDown(e); + } + }, opts); + container.addEventListener("pointerup", cancelPointerDown, opts); + container.addEventListener("pointercancel", cancelPointerDown, opts); + return; + } + if (!this.#touchMoveAC) { + this.#touchMoveAC = new AbortController(); + const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]); + const container = this.#container; + const opt = { + signal, + capture: false, + passive: false + }; + container.addEventListener("touchmove", this.#onTouchMove.bind(this), opt); + const onTouchEnd = this.#onTouchEnd.bind(this); + container.addEventListener("touchend", onTouchEnd, opt); + container.addEventListener("touchcancel", onTouchEnd, opt); + opt.capture = true; + container.addEventListener("pointerdown", stopEvent, opt); + container.addEventListener("pointermove", stopEvent, opt); + container.addEventListener("pointercancel", stopEvent, opt); + container.addEventListener("pointerup", stopEvent, opt); + this.#onPinchStart?.(); + } + stopEvent(evt); + if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) { + this.#touchInfo = null; + return; + } + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + this.#touchInfo = { + touch0X: touch0.screenX, + touch0Y: touch0.screenY, + touch1X: touch1.screenX, + touch1Y: touch1.screenY + }; + } + #onTouchMove(evt) { + if (!this.#touchInfo || evt.touches.length !== 2) { + return; + } + stopEvent(evt); + let [touch0, touch1] = evt.touches; + if (touch0.identifier > touch1.identifier) { + [touch0, touch1] = [touch1, touch0]; + } + const { + screenX: screen0X, + screenY: screen0Y + } = touch0; + const { + screenX: screen1X, + screenY: screen1Y + } = touch1; + const touchInfo = this.#touchInfo; + const { + touch0X: pTouch0X, + touch0Y: pTouch0Y, + touch1X: pTouch1X, + touch1Y: pTouch1Y + } = touchInfo; + const prevGapX = pTouch1X - pTouch0X; + const prevGapY = pTouch1Y - pTouch0Y; + const currGapX = screen1X - screen0X; + const currGapY = screen1Y - screen0Y; + const distance = Math.hypot(currGapX, currGapY) || 1; + const pDistance = Math.hypot(prevGapX, prevGapY) || 1; + if (!this.#isPinching && Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH) { + return; + } + touchInfo.touch0X = screen0X; + touchInfo.touch0Y = screen0Y; + touchInfo.touch1X = screen1X; + touchInfo.touch1Y = screen1Y; + if (!this.#isPinching) { + this.#isPinching = true; + return; + } + const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2]; + this.#onPinching?.(origin, pDistance, distance); + } + #onTouchEnd(evt) { + if (evt.touches.length >= 2) { + return; + } + if (this.#touchMoveAC) { + this.#touchMoveAC.abort(); + this.#touchMoveAC = null; + this.#onPinchEnd?.(); + } + if (!this.#touchInfo) { + return; + } + stopEvent(evt); + this.#touchInfo = null; + this.#isPinching = false; + } + destroy() { + this.#touchManagerAC?.abort(); + this.#touchManagerAC = null; + this.#pointerDownAC?.abort(); + this.#pointerDownAC = null; + } +} + +;// ./src/display/editor/editor.js + + + + + + + +class AnnotationEditor { + #accessibilityData = null; + #allResizerDivs = null; + #altText = null; + #comment = null; + #commentStandaloneButton = null; + #disabled = false; + #dragPointerId = null; + #dragPointerType = ""; + #resizersDiv = null; + #lastPointerCoords = null; + #savedDimensions = null; + #fakeAnnotation = null; + #focusAC = null; + #focusedResizerName = ""; + #hasBeenClicked = false; + #initialRect = null; + #isEditing = false; + #isInEditMode = false; + #isResizerEnabledForKeyboard = false; + #moveInDOMTimeout = null; + #prevDragX = 0; + #prevDragY = 0; + #telemetryTimeouts = null; + #touchManager = null; + isSelected = false; + _isCopy = false; + _editToolbar = null; + _initialOptions = Object.create(null); + _initialData = null; + _isVisible = true; + _uiManager = null; + _focusEventsAllowed = true; + static _l10n = null; + static _l10nResizer = null; + #isDraggable = false; + #zIndex = AnnotationEditor._zIndex++; + static _borderLineWidth = -1; + static _colorManager = new ColorManager(); + static _zIndex = 1; + static _telemetryTimeout = 1000; + static get _resizerKeyboardManager() { + const resize = AnnotationEditor.prototype._resizeWithKeyboard; + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, { + args: [-small, 0] + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, { + args: [-big, 0] + }], [["ArrowRight", "mac+ArrowRight"], resize, { + args: [small, 0] + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, { + args: [big, 0] + }], [["ArrowUp", "mac+ArrowUp"], resize, { + args: [0, -small] + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, { + args: [0, -big] + }], [["ArrowDown", "mac+ArrowDown"], resize, { + args: [0, small] + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, { + args: [0, big] + }], [["Escape", "mac+Escape"], AnnotationEditor.prototype._stopResizingWithKeyboard]])); + } + constructor(parameters) { + 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; + this.annotationElementId = null; + this._willKeepAspectRatio = false; + this._initialOptions.isCentered = parameters.isCentered; + this._structTreeParentId = null; + this.annotationElementId = parameters.annotationElementId || null; + this.creationDate = parameters.creationDate || new Date(); + this.modificationDate = parameters.modificationDate || null; + const { + rotation, + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = this.parent.viewport; + this.rotation = rotation; + this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360; + 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; + this.deleted = false; + } + get editorType() { + return Object.getPrototypeOf(this).constructor._type; + } + get mode() { + return Object.getPrototypeOf(this).constructor._editorType; + } + static get isDrawer() { + return false; + } + static get _defaultLineColor() { + return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText")); + } + static deleteAnnotationElement(editor) { + const fakeEditor = new FakeEditor({ + id: editor.parent.getNextId(), + parent: editor.parent, + uiManager: editor._uiManager + }); + fakeEditor.annotationElementId = editor.annotationElementId; + fakeEditor.deleted = true; + fakeEditor._uiManager.addToAnnotationStorage(fakeEditor); + } + static initialize(l10n, _uiManager) { + AnnotationEditor._l10n ??= l10n; + AnnotationEditor._l10nResizer ||= Object.freeze({ + topLeft: "pdfjs-editor-resizer-top-left", + topMiddle: "pdfjs-editor-resizer-top-middle", + topRight: "pdfjs-editor-resizer-top-right", + middleRight: "pdfjs-editor-resizer-middle-right", + bottomRight: "pdfjs-editor-resizer-bottom-right", + bottomMiddle: "pdfjs-editor-resizer-bottom-middle", + bottomLeft: "pdfjs-editor-resizer-bottom-left", + middleLeft: "pdfjs-editor-resizer-middle-left" + }); + if (AnnotationEditor._borderLineWidth !== -1) { + return; + } + const style = getComputedStyle(document.documentElement); + AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0; + } + static updateDefaultParams(_type, _value) {} + static get defaultPropertiesToUpdate() { + return []; + } + static isHandlingMimeForPasting(mime) { + return false; + } + static paste(item, parent) { + unreachable("Not implemented"); + } + get propertiesToUpdate() { + return []; + } + get _isDraggable() { + return this.#isDraggable; + } + set _isDraggable(value) { + this.#isDraggable = value; + this.div?.classList.toggle("draggable", value); + } + get uid() { + return this.annotationElementId || this.id; + } + get isEnterHandled() { + return true; + } + center() { + const [pageWidth, pageHeight] = this.pageDimensions; + switch (this.parentRotation) { + case 90: + this.x -= this.height * pageHeight / (pageWidth * 2); + this.y += this.width * pageWidth / (pageHeight * 2); + break; + case 180: + this.x += this.width / 2; + this.y += this.height / 2; + break; + case 270: + this.x += this.height * pageHeight / (pageWidth * 2); + this.y -= this.width * pageWidth / (pageHeight * 2); + break; + default: + this.x -= this.width / 2; + this.y -= this.height / 2; + break; + } + this.fixAndSetPosition(); + } + 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; + } else { + this.#stopResizing(); + this.#fakeAnnotation?.remove(); + this.#fakeAnnotation = null; + } + this.parent = parent; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + if (!this.#hasBeenClicked) { + this.parent.setSelected(this); + } else { + this.#hasBeenClicked = false; + } + } + focusout(event) { + if (!this._focusEventsAllowed) { + return; + } + 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() { + if (!this.isInEditMode()) { + return; + } + this.addToAnnotationStorage(); + } + addToAnnotationStorage() { + this._uiManager.addToAnnotationStorage(this); + } + 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.fixAndSetPosition(); + } + _moveAfterPaste(baseX, baseY) { + const [parentWidth, parentHeight] = this.parentDimensions; + this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight); + this._onTranslated(); + } + #translate([width, height], x, y) { + [x, y] = this.screenToPageTranslation(x, y); + this.x += x / width; + this.y += y / height; + this._onTranslating(this.x, this.y); + this.fixAndSetPosition(); + } + translate(x, y) { + this.#translate(this.parentDimensions, x, y); + } + translateInPage(x, y) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.#translate(this.pageDimensions, x, y); + this.div.scrollIntoView({ + block: "nearest" + }); + } + translationDone() { + this._onTranslated(this.x, this.y); + } + drag(tx, ty) { + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + const { + div, + parentDimensions: [parentWidth, parentHeight] + } = this; + this.x += tx / parentWidth; + this.y += ty / parentHeight; + if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) { + const { + x, + y + } = this.div.getBoundingClientRect(); + if (this.parent.findNewParent(this, x, y)) { + this.x -= Math.floor(this.x); + this.y -= Math.floor(this.y); + } + } + let { + x, + y + } = this; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + const { + style + } = div; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this._onTranslating(x, y); + div.scrollIntoView({ + block: "nearest" + }); + } + _onTranslating(x, y) {} + _onTranslated(x, y) {} + get _hasBeenMoved() { + return !!this.#initialRect && (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y); + } + get _hasBeenResized() { + return !!this.#initialRect && (this.#initialRect[2] !== this.width || this.#initialRect[3] !== this.height); + } + getBaseTranslation() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + _borderLineWidth + } = AnnotationEditor; + const x = _borderLineWidth / parentWidth; + const y = _borderLineWidth / parentHeight; + switch (this.rotation) { + case 90: + return [-x, y]; + case 180: + return [x, y]; + case 270: + return [x, -y]; + default: + return [-x, -y]; + } + } + get _mustFixPosition() { + return true; + } + fixAndSetPosition(rotation = this.rotation) { + const { + div: { + style + }, + pageDimensions: [pageWidth, pageHeight] + } = this; + let { + x, + y, + width, + height + } = this; + width *= pageWidth; + height *= pageHeight; + x *= pageWidth; + y *= pageHeight; + if (this._mustFixPosition) { + switch (rotation) { + case 0: + x = MathClamp(x, 0, pageWidth - width); + y = MathClamp(y, 0, pageHeight - height); + break; + case 90: + x = MathClamp(x, 0, pageWidth - height); + y = MathClamp(y, width, pageHeight); + break; + case 180: + x = MathClamp(x, width, pageWidth); + y = MathClamp(y, height, pageHeight); + break; + case 270: + x = MathClamp(x, height, pageWidth); + y = MathClamp(y, 0, pageHeight - width); + break; + } + } + this.x = x /= pageWidth; + this.y = y /= pageHeight; + const [bx, by] = this.getBaseTranslation(); + x += bx; + y += by; + style.left = `${(100 * x).toFixed(2)}%`; + style.top = `${(100 * y).toFixed(2)}%`; + this.moveInDOM(); + } + static #rotatePoint(x, y, angle) { + switch (angle) { + case 90: + return [y, -x]; + case 180: + return [-x, -y]; + case 270: + return [-y, x]; + default: + return [x, y]; + } + } + screenToPageTranslation(x, y) { + return AnnotationEditor.#rotatePoint(x, y, this.parentRotation); + } + pageTranslationToScreen(x, y) { + return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation); + } + #getRotationMatrix(rotation) { + switch (rotation) { + case 90: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0]; + } + case 180: + return [-1, 0, 0, -1]; + case 270: + { + const [pageWidth, pageHeight] = this.pageDimensions; + return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0]; + } + default: + return [1, 0, 0, 1]; + } + } + get parentScale() { + return this._uiManager.viewParameters.realScale; + } + get parentRotation() { + return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360; + } + get parentDimensions() { + const { + parentScale, + pageDimensions: [pageWidth, pageHeight] + } = this; + return [pageWidth * parentScale, pageHeight * parentScale]; + } + setDims() { + const { + div: { + style + }, + width, + height + } = this; + style.width = `${(100 * width).toFixed(2)}%`; + style.height = `${(100 * height).toFixed(2)}%`; + } + getInitialTranslation() { + return [0, 0]; + } + #createResizers() { + if (this.#resizersDiv) { + return; + } + this.#resizersDiv = document.createElement("div"); + this.#resizersDiv.classList.add("resizers"); + const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"]; + const signal = this._uiManager._signal; + for (const name of classes) { + const div = document.createElement("div"); + this.#resizersDiv.append(div); + div.classList.add("resizer", name); + div.setAttribute("data-resizer-name", name); + div.addEventListener("pointerdown", this.#resizerPointerdown.bind(this, name), { + signal + }); + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.tabIndex = -1; + } + this.div.prepend(this.#resizersDiv); + } + #resizerPointerdown(name, event) { + event.preventDefault(); + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#altText?.toggle(false); + const savedDraggable = this._isDraggable; + this._isDraggable = false; + this.#lastPointerCoords = [event.screenX, event.screenY]; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + this.parent.togglePointerEvents(false); + window.addEventListener("pointermove", this.#resizerPointermove.bind(this, name), { + passive: true, + capture: true, + signal + }); + window.addEventListener("touchmove", stopEvent, { + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const savedParentCursor = this.parent.div.style.cursor; + const savedCursor = this.div.style.cursor; + this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor; + const pointerUpCallback = () => { + ac.abort(); + this.parent.togglePointerEvents(true); + this.#altText?.toggle(true); + this._isDraggable = savedDraggable; + this.parent.div.style.cursor = savedParentCursor; + this.div.style.cursor = savedCursor; + this.#addResizeToUndoStack(); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + #resize(x, y, width, height) { + this.width = width; + this.height = height; + this.x = x; + this.y = y; + this.setDims(); + this.fixAndSetPosition(); + this._onResized(); + } + _onResized() {} + #addResizeToUndoStack() { + if (!this.#savedDimensions) { + return; + } + const { + savedX, + savedY, + savedWidth, + savedHeight + } = this.#savedDimensions; + this.#savedDimensions = null; + const newX = this.x; + const newY = this.y; + const newWidth = this.width; + const newHeight = this.height; + if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.addCommands({ + cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight), + undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight), + mustExec: true + }); + } + static _round(x) { + return Math.round(x * 10000) / 10000; + } + #resizerPointermove(name, event) { + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation); + const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y]; + let getPoint; + let getOpposite; + let isDiagonal = false; + let isHorizontal = false; + switch (name) { + case "topLeft": + isDiagonal = true; + getPoint = (w, h) => [0, 0]; + getOpposite = (w, h) => [w, h]; + break; + case "topMiddle": + getPoint = (w, h) => [w / 2, 0]; + getOpposite = (w, h) => [w / 2, h]; + break; + case "topRight": + isDiagonal = true; + getPoint = (w, h) => [w, 0]; + getOpposite = (w, h) => [0, h]; + break; + case "middleRight": + isHorizontal = true; + getPoint = (w, h) => [w, h / 2]; + getOpposite = (w, h) => [0, h / 2]; + break; + case "bottomRight": + isDiagonal = true; + getPoint = (w, h) => [w, h]; + getOpposite = (w, h) => [0, 0]; + break; + case "bottomMiddle": + getPoint = (w, h) => [w / 2, h]; + getOpposite = (w, h) => [w / 2, 0]; + break; + case "bottomLeft": + isDiagonal = true; + getPoint = (w, h) => [0, h]; + getOpposite = (w, h) => [w, 0]; + break; + case "middleLeft": + isHorizontal = true; + getPoint = (w, h) => [0, h / 2]; + getOpposite = (w, h) => [w, h / 2]; + break; + } + const point = getPoint(savedWidth, savedHeight); + const oppositePoint = getOpposite(savedWidth, savedHeight); + let transfOppositePoint = transf(...oppositePoint); + const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]); + const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]); + let ratioX = 1; + let ratioY = 1; + let deltaX, deltaY; + if (!event.fromKeyboard) { + const { + screenX, + screenY + } = event; + const [lastScreenX, lastScreenY] = this.#lastPointerCoords; + [deltaX, deltaY] = this.screenToPageTranslation(screenX - lastScreenX, screenY - lastScreenY); + this.#lastPointerCoords[0] = screenX; + this.#lastPointerCoords[1] = screenY; + } else { + ({ + deltaX, + deltaY + } = event); + } + [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight); + if (isDiagonal) { + const oldDiag = Math.hypot(savedWidth, savedHeight); + ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + } else if (isHorizontal) { + ratioX = MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) / savedWidth; + } else { + ratioY = MathClamp(Math.abs(oppositePoint[1] - point[1] - deltaY), minHeight, 1) / savedHeight; + } + const newWidth = AnnotationEditor._round(savedWidth * ratioX); + const newHeight = AnnotationEditor._round(savedHeight * ratioY); + transfOppositePoint = transf(...getOpposite(newWidth, newHeight)); + const newX = oppositeX - transfOppositePoint[0]; + const newY = oppositeY - transfOppositePoint[1]; + this.#initialRect ||= [this.x, this.y, this.width, this.height]; + this.width = newWidth; + this.height = newHeight; + this.x = newX; + this.y = newY; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); + } + _onResizing() {} + altTextFinish() { + this.#altText?.finish(); + } + get toolbarButtons() { + return null; + } + async addEditToolbar() { + if (this._editToolbar || this.#isInEditMode) { + return this._editToolbar; + } + this._editToolbar = new EditorToolbar(this); + this.div.append(this._editToolbar.render()); + const { + toolbarButtons + } = this; + if (toolbarButtons) { + for (const [name, tool] of toolbarButtons) { + await this._editToolbar.addButton(name, tool); + } + } + if (!this.hasComment) { + this._editToolbar.addButton("comment", this.addCommentButton()); + } + this._editToolbar.addButton("delete"); + return this._editToolbar; + } + addCommentButtonInToolbar() { + this._editToolbar?.addButtonBefore("comment", this.addCommentButton(), ".deleteButton"); + } + removeCommentButtonFromToolbar() { + this._editToolbar?.removeButton("comment"); + } + removeEditToolbar() { + this._editToolbar?.remove(); + this._editToolbar = null; + this.#altText?.destroy(); + } + addContainer(container) { + const editToolbarDiv = this._editToolbar?.div; + if (editToolbarDiv) { + editToolbarDiv.before(container); + } else { + this.div.append(container); + } + } + getClientDimensions() { + return this.div.getBoundingClientRect(); + } + createAltText() { + if (!this.#altText) { + AltText.initialize(AnnotationEditor._l10n); + this.#altText = new AltText(this); + if (this.#accessibilityData) { + this.#altText.data = this.#accessibilityData; + this.#accessibilityData = null; + } + } + return this.#altText; + } + get altTextData() { + return this.#altText?.data; + } + set altTextData(data) { + if (!this.#altText) { + return; + } + this.#altText.data = data; + } + get guessedAltText() { + return this.#altText?.guessedText; + } + async setGuessedAltText(text) { + await this.#altText?.setGuessedText(text); + } + serializeAltText(isForCopying) { + return this.#altText?.serialize(isForCopying); + } + hasAltText() { + return !!this.#altText && !this.#altText.isEmpty(); + } + hasAltTextData() { + return this.#altText?.hasData() ?? false; + } + focusCommentButton() { + this.#comment?.focusButton(); + } + addCommentButton() { + return this.#comment ||= new Comment(this); + } + addStandaloneCommentButton() { + if (this.#commentStandaloneButton) { + if (this._uiManager.isEditingMode()) { + this.#commentStandaloneButton.classList.remove("hidden"); + } + return; + } + if (!this.hasComment) { + return; + } + this.#commentStandaloneButton = this.#comment.renderForStandalone(); + this.div.append(this.#commentStandaloneButton); + } + removeStandaloneCommentButton() { + this.#comment.removeStandaloneCommentButton(); + this.#commentStandaloneButton = null; + } + hideStandaloneCommentButton() { + this.#commentStandaloneButton?.classList.add("hidden"); + } + get comment() { + const { + data: { + richText, + text, + date, + deleted + } + } = this.#comment; + return { + text, + richText, + date, + deleted, + color: this.getNonHCMColor(), + opacity: this.opacity ?? 1 + }; + } + set comment(text) { + this.#comment ||= new Comment(this); + this.#comment.data = text; + if (this.hasComment) { + this.removeCommentButtonFromToolbar(); + this.addStandaloneCommentButton(); + this._uiManager.updateComment(this); + } else { + this.addCommentButtonInToolbar(); + this.removeStandaloneCommentButton(); + this._uiManager.removeComment(this); + } + } + setCommentData({ + comment, + popupRef, + richText + }) { + if (!popupRef) { + return; + } + this.#comment ||= new Comment(this); + this.#comment.setInitialText(comment, richText); + if (!this.annotationElementId) { + return; + } + const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(this.annotationElementId); + if (storedData) { + this.updateFromAnnotationLayer(storedData); + } + } + get hasEditedComment() { + return this.#comment?.hasBeenEdited(); + } + get hasDeletedComment() { + return this.#comment?.isDeleted(); + } + get hasComment() { + return !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted(); + } + async editComment(options) { + this.#comment ||= new Comment(this); + this.#comment.edit(options); + } + toggleComment(isSelected, visibility = undefined) { + if (this.hasComment) { + this._uiManager.toggleComment(this, isSelected, visibility); + } + } + setSelectedCommentButton(selected) { + this.#comment.setSelectedButton(selected); + } + addComment(serialized) { + if (this.hasEditedComment) { + const DEFAULT_POPUP_WIDTH = 180; + const DEFAULT_POPUP_HEIGHT = 100; + const [,,, trY] = serialized.rect; + const [pageWidth] = this.pageDimensions; + const [pageX] = this.pageTranslation; + const blX = pageX + pageWidth + 1; + const blY = trY - DEFAULT_POPUP_HEIGHT; + const trX = blX + DEFAULT_POPUP_WIDTH; + serialized.popup = { + contents: this.comment.text, + deleted: this.comment.deleted, + rect: [blX, blY, trX, trY] + }; + } + } + updateFromAnnotationLayer({ + popup: { + contents, + deleted + } + }) { + this.#comment.data = deleted ? null : contents; + } + get parentBoundingClientRect() { + return this.parent.boundingClientRect; + } + render() { + const div = this.div = document.createElement("div"); + div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360); + div.className = this.name; + div.setAttribute("id", this.id); + div.tabIndex = this.#disabled ? -1 : 0; + div.setAttribute("role", "application"); + if (this.defaultL10nId) { + div.setAttribute("data-l10n-id", this.defaultL10nId); + } + if (!this._isVisible) { + div.classList.add("hidden"); + } + this.setInForeground(); + this.#addFocusListeners(); + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.parentRotation % 180 !== 0) { + div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`; + div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`; + } + const [tx, ty] = this.getInitialTranslation(); + this.translate(tx, ty); + bindEvents(this, div, ["keydown", "pointerdown", "dblclick"]); + if (this.isResizable && this._uiManager._supportsPinchToZoom) { + this.#touchManager ||= new TouchManager({ + container: div, + isPinchingDisabled: () => !this.isSelected, + onPinchStart: this.#touchPinchStartCallback.bind(this), + onPinching: this.#touchPinchCallback.bind(this), + onPinchEnd: this.#touchPinchEndCallback.bind(this), + signal: this._uiManager._signal + }); + } + this.addStandaloneCommentButton(); + this._uiManager._editorUndoBar?.hide(); + return div; + } + #touchPinchStartCallback() { + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + this.#altText?.toggle(false); + this.parent.togglePointerEvents(false); + } + #touchPinchCallback(_origin, prevDistance, distance) { + const slowDownFactor = 0.7; + let factor = slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor; + if (factor === 1) { + return; + } + const rotationMatrix = this.#getRotationMatrix(this.rotation); + const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y]; + const [parentWidth, parentHeight] = this.parentDimensions; + const savedX = this.x; + const savedY = this.y; + const savedWidth = this.width; + const savedHeight = this.height; + const minWidth = AnnotationEditor.MIN_SIZE / parentWidth; + const minHeight = AnnotationEditor.MIN_SIZE / parentHeight; + factor = Math.max(Math.min(factor, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight); + const newWidth = AnnotationEditor._round(savedWidth * factor); + const newHeight = AnnotationEditor._round(savedHeight * factor); + if (newWidth === savedWidth && newHeight === savedHeight) { + return; + } + this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight]; + const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2); + const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]); + const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]); + const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2); + this.x = centerX - newTransfCenterPoint[0]; + this.y = centerY - newTransfCenterPoint[1]; + this.width = newWidth; + this.height = newHeight; + this.setDims(); + this.fixAndSetPosition(); + this._onResizing(); + } + #touchPinchEndCallback() { + this.#altText?.toggle(true); + this.parent.togglePointerEvents(true); + this.#addResizeToUndoStack(); + } + pointerdown(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + event.preventDefault(); + return; + } + this.#hasBeenClicked = true; + if (this._isDraggable) { + this.#setUpDragSession(event); + return; + } + this.#selectOnPointerEvent(event); + } + #selectOnPointerEvent(event) { + const { + isMac + } = util_FeatureTest.platform; + if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) { + this.parent.toggleSelected(this); + } else { + this.parent.setSelected(this); + } + } + #setUpDragSession(event) { + const { + isSelected + } = this; + this._uiManager.setUpDragSession(); + let hasDraggingStarted = false; + const ac = new AbortController(); + const signal = this._uiManager.combinedSignal(ac); + const opts = { + capture: true, + passive: false, + signal + }; + const cancelDrag = e => { + ac.abort(); + this.#dragPointerId = null; + this.#hasBeenClicked = false; + if (!this._uiManager.endDragSession()) { + this.#selectOnPointerEvent(e); + } + if (hasDraggingStarted) { + this._onStopDragging(); + } + }; + if (isSelected) { + this.#prevDragX = event.clientX; + this.#prevDragY = event.clientY; + this.#dragPointerId = event.pointerId; + this.#dragPointerType = event.pointerType; + window.addEventListener("pointermove", e => { + if (!hasDraggingStarted) { + hasDraggingStarted = true; + this._uiManager.toggleComment(this, true, false); + this._onStartDragging(); + } + const { + clientX: x, + clientY: y, + pointerId + } = e; + if (pointerId !== this.#dragPointerId) { + stopEvent(e); + return; + } + const [tx, ty] = this.screenToPageTranslation(x - this.#prevDragX, y - this.#prevDragY); + this.#prevDragX = x; + this.#prevDragY = y; + this._uiManager.dragSelectedEditors(tx, ty); + }, opts); + window.addEventListener("touchmove", stopEvent, opts); + window.addEventListener("pointerdown", e => { + if (e.pointerType === this.#dragPointerType) { + if (this.#touchManager || e.isPrimary) { + cancelDrag(e); + } + } + stopEvent(e); + }, opts); + } + const pointerUpCallback = e => { + if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) { + cancelDrag(e); + return; + } + stopEvent(e); + }; + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("blur", pointerUpCallback, { + signal + }); + } + _onStartDragging() {} + _onStopDragging() {} + moveInDOM() { + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + } + this.#moveInDOMTimeout = setTimeout(() => { + this.#moveInDOMTimeout = null; + this.parent?.moveEditorInDOM(this); + }, 0); + } + _setParentAndPosition(parent, x, y) { + parent.changeParent(this); + this.x = x; + this.y = y; + this.fixAndSetPosition(); + this._onTranslated(); + } + getRect(tx, ty, rotation = this.rotation) { + 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 (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"); + } + } + getPDFRect() { + return this.getRect(0, 0); + } + getNonHCMColor() { + return this.color && AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)); + } + onUpdatedColor() { + this.#comment?.onUpdatedColor(); + } + getData() { + const { + comment: { + text: str, + color, + date, + opacity, + deleted, + richText + }, + uid: id, + pageIndex, + creationDate, + modificationDate + } = this; + return { + id, + pageIndex, + rect: this.getPDFRect(), + richText, + contentsObj: { + str + }, + creationDate, + modificationDate: date || modificationDate, + popupRef: !deleted, + color, + opacity + }; + } + onceAdded(focus) {} + isEmpty() { + return false; + } + enableEditMode() { + if (this.isInEditMode()) { + return false; + } + this.parent.setEditingState(false); + this.#isInEditMode = true; + return true; + } + disableEditMode() { + if (!this.isInEditMode()) { + return false; + } + this.parent.setEditingState(true); + this.#isInEditMode = false; + return true; + } + isInEditMode() { + return this.#isInEditMode; + } + shouldGetKeyboardEvents() { + return this.#isResizerEnabledForKeyboard; + } + needsToBeRebuilt() { + return this.div && !this.isAttachedToDOM; + } + get isOnScreen() { + const { + top, + left, + bottom, + right + } = this.getClientDimensions(); + const { + innerHeight, + innerWidth + } = window; + return left < innerWidth && right > 0 && top < innerHeight && bottom > 0; + } + #addFocusListeners() { + if (this.#focusAC || !this.div) { + return; + } + this.#focusAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#focusAC); + this.div.addEventListener("focusin", this.focusin.bind(this), { + signal + }); + this.div.addEventListener("focusout", this.focusout.bind(this), { + signal + }); + } + rebuild() { + this.#addFocusListeners(); + } + rotate(_angle) {} + resize() {} + serializeDeleted() { + return { + id: this.annotationElementId, + deleted: true, + pageIndex: this.pageIndex, + popupRef: this._initialData?.popupRef || "" + }; + } + serialize(isForCopying = false, context = null) { + return { + annotationType: this.mode, + pageIndex: this.pageIndex, + rect: this.getPDFRect(), + rotation: this.rotation, + structTreeParentId: this._structTreeParentId, + popupRef: this._initialData?.popupRef || "" + }; + } + static async deserialize(data, parent, uiManager) { + const editor = new this.prototype.constructor({ + parent, + id: parent.getNextId(), + uiManager, + annotationElementId: data.annotationElementId, + creationDate: data.creationDate, + modificationDate: data.modificationDate + }); + editor.rotation = data.rotation; + editor.#accessibilityData = data.accessibilityData; + editor._isCopy = data.isCopy || false; + 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; + } + get hasBeenModified() { + return !!this.annotationElementId && (this.deleted || this.serialize() !== null); + } + remove() { + this.#focusAC?.abort(); + this.#focusAC = null; + if (!this.isEmpty()) { + this.commit(); + } + if (this.parent) { + this.parent.remove(this); + } else { + this._uiManager.removeEditor(this); + } + if (this.#moveInDOMTimeout) { + clearTimeout(this.#moveInDOMTimeout); + this.#moveInDOMTimeout = null; + } + this.#stopResizing(); + this.removeEditToolbar(); + if (this.#telemetryTimeouts) { + for (const timeout of this.#telemetryTimeouts.values()) { + clearTimeout(timeout); + } + this.#telemetryTimeouts = null; + } + this.parent = null; + this.#touchManager?.destroy(); + this.#touchManager = null; + } + get isResizable() { + return false; + } + makeResizable() { + if (this.isResizable) { + this.#createResizers(); + this.#resizersDiv.classList.remove("hidden"); + } + } + get toolbarPosition() { + return null; + } + get commentButtonPosition() { + return this._uiManager.direction === "ltr" ? [1, 0] : [0, 0]; + } + get commentButtonPositionInPage() { + const { + commentButtonPosition: [posX, posY] + } = this; + const [blX, blY, trX, trY] = this.getPDFRect(); + return [AnnotationEditor._round(blX + (trX - blX) * posX), AnnotationEditor._round(blY + (trY - blY) * (1 - posY))]; + } + get commentButtonColor() { + return this._uiManager.makeCommentColor(this.getNonHCMColor(), this.opacity); + } + get commentPopupPosition() { + return this.#comment.commentPopupPositionInLayer; + } + set commentPopupPosition(pos) { + this.#comment.commentPopupPositionInLayer = pos; + } + hasDefaultPopupPosition() { + return this.#comment.hasDefaultPopupPosition(); + } + get commentButtonWidth() { + return this.#comment.commentButtonWidth; + } + get elementBeforePopup() { + return this.div; + } + setCommentButtonStates(options) { + this.#comment.setCommentButtonStates(options); + } + keydown(event) { + if (!this.isResizable || event.target !== this.div || event.key !== "Enter") { + return; + } + this._uiManager.setSelected(this); + this.#savedDimensions = { + savedX: this.x, + savedY: this.y, + savedWidth: this.width, + savedHeight: this.height + }; + const children = this.#resizersDiv.children; + if (!this.#allResizerDivs) { + this.#allResizerDivs = Array.from(children); + const boundResizerKeydown = this.#resizerKeydown.bind(this); + const boundResizerBlur = this.#resizerBlur.bind(this); + const signal = this._uiManager._signal; + for (const div of this.#allResizerDivs) { + const name = div.getAttribute("data-resizer-name"); + div.setAttribute("role", "spinbutton"); + div.addEventListener("keydown", boundResizerKeydown, { + signal + }); + div.addEventListener("blur", boundResizerBlur, { + signal + }); + div.addEventListener("focus", this.#resizerFocus.bind(this, name), { + signal + }); + div.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + const first = this.#allResizerDivs[0]; + let firstPosition = 0; + for (const div of children) { + if (div === first) { + break; + } + firstPosition++; + } + const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (this.#allResizerDivs.length / 4); + if (nextFirstPosition !== firstPosition) { + if (nextFirstPosition < firstPosition) { + for (let i = 0; i < firstPosition - nextFirstPosition; i++) { + this.#resizersDiv.append(this.#resizersDiv.firstChild); + } + } else if (nextFirstPosition > firstPosition) { + for (let i = 0; i < nextFirstPosition - firstPosition; i++) { + this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild); + } + } + let i = 0; + for (const child of children) { + const div = this.#allResizerDivs[i++]; + const name = div.getAttribute("data-resizer-name"); + child.setAttribute("data-l10n-id", AnnotationEditor._l10nResizer[name]); + } + } + this.#setResizerTabIndex(0); + this.#isResizerEnabledForKeyboard = true; + this.#resizersDiv.firstChild.focus({ + focusVisible: true + }); + event.preventDefault(); + event.stopImmediatePropagation(); + } + #resizerKeydown(event) { + AnnotationEditor._resizerKeyboardManager.exec(this, event); + } + #resizerBlur(event) { + if (this.#isResizerEnabledForKeyboard && event.relatedTarget?.parentNode !== this.#resizersDiv) { + this.#stopResizing(); + } + } + #resizerFocus(name) { + this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : ""; + } + #setResizerTabIndex(value) { + if (!this.#allResizerDivs) { + return; + } + for (const div of this.#allResizerDivs) { + div.tabIndex = value; + } + } + _resizeWithKeyboard(x, y) { + if (!this.#isResizerEnabledForKeyboard) { + return; + } + this.#resizerPointermove(this.#focusedResizerName, { + deltaX: x, + deltaY: y, + fromKeyboard: true + }); + } + #stopResizing() { + this.#isResizerEnabledForKeyboard = false; + this.#setResizerTabIndex(-1); + this.#addResizeToUndoStack(); + } + _stopResizingWithKeyboard() { + this.#stopResizing(); + this.div.focus(); + } + select() { + if (this.isSelected && this._editToolbar) { + this._editToolbar.show(); + return; + } + this.isSelected = true; + this.makeResizable(); + this.div?.classList.add("selectedEditor"); + if (!this._editToolbar) { + this.addEditToolbar().then(() => { + if (this.div?.classList.contains("selectedEditor")) { + this._editToolbar?.show(); + } + }); + return; + } + this._editToolbar?.show(); + this.#altText?.toggleAltTextBadge(false); + } + focus() { + if (this.div && !this.div.contains(document.activeElement)) { + setTimeout(() => this.div?.focus({ + preventScroll: true + }), 0); + } + } + unselect() { + if (!this.isSelected) { + return; + } + this.isSelected = false; + this.#resizersDiv?.classList.add("hidden"); + this.div?.classList.remove("selectedEditor"); + if (this.div?.contains(document.activeElement)) { + this._uiManager.currentLayer.div.focus({ + preventScroll: true + }); + } + this._editToolbar?.hide(); + this.#altText?.toggleAltTextBadge(true); + if (this.hasComment) { + this._uiManager.toggleComment(this, false, false); + } + } + updateParams(type, value) {} + disableEditing() {} + enableEditing() {} + get canChangeContent() { + return false; + } + enterInEditMode() { + if (!this.canChangeContent) { + return; + } + this.enableEditMode(); + this.div.focus(); + } + dblclick(event) { + if (event.target.nodeName === "BUTTON") { + return; + } + this.enterInEditMode(); + this.parent.updateToolbar({ + mode: this.constructor._editorType, + editId: this.id + }); + } + getElementForAltText() { + return this.div; + } + get contentDiv() { + return this.div; + } + get isEditing() { + return this.#isEditing; + } + set isEditing(value) { + this.#isEditing = value; + if (!this.parent) { + return; + } + if (value) { + this.parent.setSelected(this); + this.parent.setActiveEditor(this); + } else { + this.parent.setActiveEditor(null); + } + } + static get MIN_SIZE() { + return 16; + } + static canCreateNewEmptyEditor() { + return true; + } + get telemetryInitialData() { + return { + action: "added" + }; + } + get telemetryFinalData() { + return null; + } + _reportTelemetry(data, mustWait = false) { + if (mustWait) { + this.#telemetryTimeouts ||= new Map(); + const { + action + } = data; + let timeout = this.#telemetryTimeouts.get(action); + if (timeout) { + clearTimeout(timeout); + } + timeout = setTimeout(() => { + this._reportTelemetry(data); + this.#telemetryTimeouts.delete(action); + if (this.#telemetryTimeouts.size === 0) { + this.#telemetryTimeouts = null; + } + }, AnnotationEditor._telemetryTimeout); + this.#telemetryTimeouts.set(action, timeout); + return; + } + data.type ||= this.editorType; + this._uiManager._eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + show(visible = this._isVisible) { + this.div.classList.toggle("hidden", !visible); + this._isVisible = visible; + } + enable() { + if (this.div) { + this.div.tabIndex = 0; + } + this.#disabled = false; + } + disable() { + if (this.div) { + this.div.tabIndex = -1; + } + this.#disabled = true; + } + updateFakeAnnotationElement(annotationLayer) { + if (!this.#fakeAnnotation && !this.deleted) { + this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this); + return; + } + if (this.deleted) { + this.#fakeAnnotation.remove(); + this.#fakeAnnotation = null; + return; + } + if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) { + this.#fakeAnnotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + } + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + let content = annotation.container.querySelector(".annotationContent"); + if (!content) { + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + annotation.container.prepend(content); + } else if (content.nodeName === "CANVAS") { + const canvas = content; + content = document.createElement("div"); + content.classList.add("annotationContent", this.editorType); + canvas.before(content); + } + return content; + } + resetAnnotationElement(annotation) { + const { + firstChild + } = annotation.container; + if (firstChild?.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) { + firstChild.remove(); + } + } +} +class FakeEditor extends AnnotationEditor { + constructor(params) { + super(params); + this.annotationElementId = params.annotationElementId; + this.deleted = true; + } + serialize() { + return this.serializeDeleted(); + } +} + +;// ./src/shared/murmurhash3.js +const SEED = 0xc3d2e1f0; +const MASK_HIGH = 0xffff0000; +const MASK_LOW = 0xffff; +class MurmurHash3_64 { + constructor(seed) { + this.h1 = seed ? seed & 0xffffffff : SEED; + this.h2 = seed ? seed & 0xffffffff : SEED; + } + update(input) { + let data, length; + if (typeof input === "string") { + data = new Uint8Array(input.length * 2); + length = 0; + for (let i = 0, ii = input.length; i < ii; i++) { + const code = input.charCodeAt(i); + if (code <= 0xff) { + data[length++] = code; + } else { + data[length++] = code >>> 8; + data[length++] = code & 0xff; + } + } + } else if (ArrayBuffer.isView(input)) { + data = input.slice(); + length = data.byteLength; + } else { + throw new Error("Invalid data format, must be a string or TypedArray."); + } + const blockCounts = length >> 2; + const tailLength = length - blockCounts * 4; + const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts); + let k1 = 0, + k2 = 0; + let h1 = this.h1, + h2 = this.h2; + const C1 = 0xcc9e2d51, + C2 = 0x1b873593; + const C1_LOW = C1 & MASK_LOW, + C2_LOW = C2 & MASK_LOW; + for (let i = 0; i < blockCounts; i++) { + if (i & 1) { + k1 = dataUint32[i]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + h1 ^= k1; + h1 = h1 << 13 | h1 >>> 19; + h1 = h1 * 5 + 0xe6546b64; + } else { + k2 = dataUint32[i]; + k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW; + k2 = k2 << 15 | k2 >>> 17; + k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW; + h2 ^= k2; + h2 = h2 << 13 | h2 >>> 19; + h2 = h2 * 5 + 0xe6546b64; + } + } + k1 = 0; + switch (tailLength) { + case 3: + k1 ^= data[blockCounts * 4 + 2] << 16; + case 2: + k1 ^= data[blockCounts * 4 + 1] << 8; + case 1: + k1 ^= data[blockCounts * 4]; + k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW; + k1 = k1 << 15 | k1 >>> 17; + k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW; + if (blockCounts & 1) { + h1 ^= k1; + } else { + h2 ^= k1; + } + } + this.h1 = h1; + this.h2 = h2; + } + hexdigest() { + let h1 = this.h1, + h2 = this.h2; + h1 ^= h2 >>> 1; + h1 = h1 * 0xed558ccd & MASK_HIGH | h1 * 0x8ccd & MASK_LOW; + h2 = h2 * 0xff51afd7 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + h1 = h1 * 0x1a85ec53 & MASK_HIGH | h1 * 0xec53 & MASK_LOW; + h2 = h2 * 0xc4ceb9fe & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16; + h1 ^= h2 >>> 1; + return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0"); + } +} + +;// ./src/display/annotation_storage.js + + + +const SerializableEmpty = Object.freeze({ + map: null, + hash: "", + transfer: undefined +}); +class AnnotationStorage { + #modified = false; + #modifiedIds = null; + #editorsMap = null; + #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) { + const storedValue = this.#storage.get(key); + if (storedValue === undefined) { + return; + } + if (storedValue instanceof AnnotationEditor) { + this.#editorsMap.delete(storedValue.annotationElementId); + } + 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 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 AnnotationEditor) { + (this.#editorsMap ||= new Map()).set(value.annotationElementId, value); + if (typeof this.onAnnotationEditor === "function") { + this.onAnnotationEditor(value.constructor._type); + } + } + } + has(key) { + return this.#storage.has(key); + } + 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 SerializableEmpty; + } + const map = new Map(), + hash = new MurmurHash3_64(), + transfer = []; + const context = Object.create(null); + let hasBitmap = false; + for (const [key, val] of this.#storage) { + const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val; + if (serialized) { + map.set(key, serialized); + hash.update(`${key}:${JSON.stringify(serialized)}`); + hasBitmap ||= !!serialized.bitmap; + } + } + if (hasBitmap) { + for (const value of map.values()) { + if (value.bitmap) { + transfer.push(value.bitmap); + } + } + } + return map.size > 0 ? { + map, + hash: hash.hexdigest(), + transfer + } : SerializableEmpty; + } + get editorStats() { + let stats = null; + const typeToEditor = new Map(); + let numberOfEditedComments = 0; + let numberOfDeletedComments = 0; + for (const value of this.#storage.values()) { + if (!(value instanceof AnnotationEditor)) { + if (value.popup) { + if (value.popup.deleted) { + numberOfDeletedComments += 1; + } else { + numberOfEditedComments += 1; + } + } + continue; + } + if (value.isCommentDeleted) { + numberOfDeletedComments += 1; + } else if (value.hasEditedComment) { + numberOfEditedComments += 1; + } + const editorStats = value.telemetryFinalData; + if (!editorStats) { + continue; + } + const { + type + } = editorStats; + if (!typeToEditor.has(type)) { + typeToEditor.set(type, Object.getPrototypeOf(value).constructor); + } + stats ||= Object.create(null); + const map = stats[type] ||= new Map(); + for (const [key, val] of Object.entries(editorStats)) { + if (key === "type") { + continue; + } + let counters = map.get(key); + if (!counters) { + counters = new Map(); + map.set(key, counters); + } + const count = counters.get(val) ?? 0; + counters.set(val, count + 1); + } + } + if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) { + stats ||= Object.create(null); + stats.comments = { + deleted: numberOfDeletedComments, + edited: numberOfEditedComments + }; + } + if (!stats) { + return null; + } + for (const [type, editor] of typeToEditor) { + stats[type] = editor.computeTelemetryFinalData(stats[type]); + } + return stats; + } + resetModifiedIds() { + this.#modifiedIds = null; + } + updateEditor(annotationId, data) { + const value = this.#editorsMap?.get(annotationId); + if (value) { + value.updateFromAnnotationLayer(data); + return true; + } + return false; + } + getEditor(annotationId) { + return this.#editorsMap?.get(annotationId) || null; + } + get modifiedIds() { + if (this.#modifiedIds) { + return this.#modifiedIds; + } + const ids = []; + if (this.#editorsMap) { + for (const value of this.#editorsMap.values()) { + if (!value.serialize()) { + continue; + } + ids.push(value.annotationElementId); + } + } + return this.#modifiedIds = { + ids: new Set(ids), + hash: ids.join(",") + }; + } + [Symbol.iterator]() { + return this.#storage.entries(); + } +} +class PrintAnnotationStorage extends AnnotationStorage { + #serializable; + constructor(parent) { + super(); + const { + map, + hash, + transfer + } = parent.serializable; + const clone = structuredClone(map, transfer ? { + transfer + } : null); + this.#serializable = { + map: clone, + hash, + transfer + }; + } + get print() { + unreachable("Should not call PrintAnnotationStorage.print"); + } + get serializable() { + return this.#serializable; + } + get modifiedIds() { + return shadow(this, "modifiedIds", { + ids: new Set(), + hash: "" + }); + } +} + +;// ./src/display/font_loader.js + +class FontLoader { + #systemFonts = new Set(); + constructor({ + ownerDocument = globalThis.document, + styleElement = null + }) { + this._document = ownerDocument; + this.nativeFontFaces = new Set(); + this.styleElement = null; + this.loadingRequests = []; + this.loadTestFontId = 0; + } + addNativeFontFace(nativeFontFace) { + this.nativeFontFaces.add(nativeFontFace); + this._document.fonts.add(nativeFontFace); + } + removeNativeFontFace(nativeFontFace) { + this.nativeFontFaces.delete(nativeFontFace); + this._document.fonts.delete(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.clear(); + this.#systemFonts.clear(); + if (this.styleElement) { + this.styleElement.remove(); + this.styleElement = null; + } + } + async loadSystemFont({ + systemFontInfo: info, + disableFontFace, + _inspectFont + }) { + if (!info || this.#systemFonts.has(info.loadedName)) { + return; + } + assert(!disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set."); + if (this.isFontLoadingAPISupported) { + const { + loadedName, + src, + style + } = info; + const fontFace = new FontFace(loadedName, src, style); + this.addNativeFontFace(fontFace); + try { + await fontFace.load(); + this.#systemFonts.add(loadedName); + _inspectFont?.(info); + } catch { + warn(`Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`); + this.removeNativeFontFace(fontFace); + } + return; + } + unreachable("Not implemented: loadSystemFont without the Font Loading API."); + } + async bind(font) { + if (font.attached || font.missingFile && !font.systemFontInfo) { + return; + } + font.attached = true; + if (font.systemFontInfo) { + await this.loadSystemFont(font); + return; + } + if (this.isFontLoadingAPISupported) { + const nativeFontFace = font.createNativeFontFace(); + if (nativeFontFace) { + this.addNativeFontFace(nativeFontFace); + try { + await nativeFontFace.loaded; + } catch (ex) { + 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 shadow(this, "isFontLoadingAPISupported", hasFonts); + } + get isSyncFontLoadingSupported() { + return shadow(this, "isSyncFontLoadingSupported", isNodeJS || util_FeatureTest.platform.isFirefox); + } + _queueLoadingCallback(callback) { + function completeRequest() { + 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 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) { + 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, 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(); + }); + } +} +class FontFaceObject { + #fontData; + constructor(translatedData, inspectFont = null, extra, charProcOperatorList) { + this.compiledGlyphs = Object.create(null); + this.#fontData = translatedData; + this._inspectFont = inspectFont; + if (extra) { + Object.assign(this, extra); + } + if (charProcOperatorList) { + this.charProcOperatorList = charProcOperatorList; + } + } + 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._inspectFont?.(this); + return nativeFontFace; + } + createFontFaceRule() { + if (!this.data || this.disableFontFace) { + return null; + } + const url = `url(data:${this.mimetype};base64,${toBase64Util(this.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._inspectFont?.(this, url); + return rule; + } + getPathGenerator(objs, character) { + if (this.compiledGlyphs[character] !== undefined) { + return this.compiledGlyphs[character]; + } + const objId = this.loadedName + "_path_" + character; + let cmds; + try { + cmds = objs.get(objId); + } catch (ex) { + warn(`getPathGenerator - ignoring character: "${ex}".`); + } + const path = new Path2D(cmds || ""); + if (!this.fontExtraProperties) { + objs.delete(objId); + } + return this.compiledGlyphs[character] = path; + } + get black() { + return this.#fontData.black; + } + get bold() { + return this.#fontData.bold; + } + get disableFontFace() { + return this.#fontData.disableFontFace ?? false; + } + get fontExtraProperties() { + return this.#fontData.fontExtraProperties ?? false; + } + get isInvalidPDFjsFont() { + return this.#fontData.isInvalidPDFjsFont; + } + get isType3Font() { + return this.#fontData.isType3Font; + } + get italic() { + return this.#fontData.italic; + } + get missingFile() { + return this.#fontData.missingFile; + } + get remeasure() { + return this.#fontData.remeasure; + } + get vertical() { + return this.#fontData.vertical; + } + get ascent() { + return this.#fontData.ascent; + } + get defaultWidth() { + return this.#fontData.defaultWidth; + } + get descent() { + return this.#fontData.descent; + } + get bbox() { + return this.#fontData.bbox; + } + get fontMatrix() { + return this.#fontData.fontMatrix; + } + get fallbackName() { + return this.#fontData.fallbackName; + } + get loadedName() { + return this.#fontData.loadedName; + } + get mimetype() { + return this.#fontData.mimetype; + } + get name() { + return this.#fontData.name; + } + get data() { + return this.#fontData.data; + } + clearData() { + this.#fontData.clearData(); + } + get cssFontInfo() { + return this.#fontData.cssFontInfo; + } + get systemFontInfo() { + return this.#fontData.systemFontInfo; + } + get defaultVMetrics() { + return this.#fontData.defaultVMetrics; + } +} + +;// ./src/display/api_utils.js + +function getUrlProp(val) { + if (val instanceof URL) { + return val.href; + } + if (typeof val === "string") { + if (isNodeJS) { + return val; + } + const url = URL.parse(val, window.location); + if (url) { + return url.href; + } + } + throw new Error("Invalid PDF url data: " + "either string or URL-object is expected in the url property."); +} +function getDataProp(val) { + if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) { + throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`."); + } + if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) { + return val; + } + if (typeof val === "string") { + return stringToBytes(val); + } + if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val?.length)) { + return new Uint8Array(val); + } + throw new Error("Invalid PDF binary data: either TypedArray, " + "string, or array-like object is expected in the data property."); +} +function getFactoryUrlProp(val) { + if (typeof val !== "string") { + return null; + } + if (val.endsWith("/")) { + return val; + } + throw new Error(`Invalid factory url: "${val}" must include trailing slash.`); +} +const isRefProxy = v => typeof v === "object" && Number.isInteger(v?.num) && v.num >= 0 && Number.isInteger(v?.gen) && v.gen >= 0; +const isNameProxy = v => typeof v === "object" && typeof v?.name === "string"; +const isValidExplicitDest = _isValidExplicitDest.bind(null, isRefProxy, isNameProxy); +class LoopbackPort { + #listeners = new Map(); + #deferred = Promise.resolve(); + postMessage(obj, transfer) { + const event = { + data: structuredClone(obj, transfer ? { + transfer + } : null) + }; + this.#deferred.then(() => { + for (const [listener] of this.#listeners) { + listener.call(this, event); + } + }); + } + addEventListener(name, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + warn("LoopbackPort - cannot use an `aborted` signal."); + return; + } + const onAbort = () => this.removeEventListener(name, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + this.#listeners.set(listener, rmAbort); + } + removeEventListener(name, listener) { + const rmAbort = this.#listeners.get(listener); + rmAbort?.(); + this.#listeners.delete(listener); + } + terminate() { + for (const [, rmAbort] of this.#listeners) { + rmAbort?.(); + } + this.#listeners.clear(); + } +} + +;// ./src/shared/message_handler.js + +const CallbackKind = { + DATA: 1, + ERROR: 2 +}; +const StreamKind = { + CANCEL: 1, + CANCEL_COMPLETE: 2, + CLOSE: 3, + ENQUEUE: 4, + ERROR: 5, + PULL: 6, + PULL_COMPLETE: 7, + START_COMPLETE: 8 +}; +function onFn() {} +function wrapReason(ex) { + if (ex instanceof AbortException || ex instanceof InvalidPDFException || ex instanceof PasswordException || ex instanceof ResponseException || ex instanceof UnknownErrorException) { + return ex; + } + if (!(ex instanceof Error || typeof ex === "object" && ex !== null)) { + unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.'); + } + switch (ex.name) { + case "AbortException": + return new AbortException(ex.message); + case "InvalidPDFException": + return new InvalidPDFException(ex.message); + case "PasswordException": + return new PasswordException(ex.message, ex.code); + case "ResponseException": + return new ResponseException(ex.message, ex.status, ex.missing); + case "UnknownErrorException": + return new UnknownErrorException(ex.message, ex.details); + } + return new UnknownErrorException(ex.message, ex.toString()); +} +class MessageHandler { + #messageAC = new AbortController(); + constructor(sourceName, targetName, comObj) { + this.sourceName = sourceName; + this.targetName = targetName; + this.comObj = comObj; + this.callbackId = 1; + this.streamId = 1; + this.streamSinks = Object.create(null); + this.streamControllers = Object.create(null); + this.callbackCapabilities = Object.create(null); + this.actionHandler = Object.create(null); + comObj.addEventListener("message", this.#onMessage.bind(this), { + signal: this.#messageAC.signal + }); + } + #onMessage({ + data + }) { + if (data.targetName !== this.sourceName) { + return; + } + if (data.stream) { + this.#processStreamMessage(data); + return; + } + if (data.callback) { + const callbackId = data.callbackId; + const capability = this.callbackCapabilities[callbackId]; + if (!capability) { + throw new Error(`Cannot resolve callback ${callbackId}`); + } + delete this.callbackCapabilities[callbackId]; + if (data.callback === CallbackKind.DATA) { + capability.resolve(data.data); + } else if (data.callback === CallbackKind.ERROR) { + capability.reject(wrapReason(data.reason)); + } else { + throw new Error("Unexpected callback case"); + } + return; + } + const action = this.actionHandler[data.action]; + if (!action) { + throw new Error(`Unknown action from worker: ${data.action}`); + } + if (data.callbackId) { + const sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + Promise.try(action, data.data).then(function (result) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.DATA, + callbackId: data.callbackId, + data: result + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + callback: CallbackKind.ERROR, + callbackId: data.callbackId, + reason: wrapReason(reason) + }); + }); + return; + } + if (data.streamId) { + this.#createStreamSink(data); + return; + } + action(data.data); + } + on(actionName, handler) { + const ah = this.actionHandler; + if (ah[actionName]) { + throw new Error(`There is already an actionName called "${actionName}"`); + } + ah[actionName] = handler; + } + send(actionName, data, transfers) { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + data + }, transfers); + } + sendWithPromise(actionName, data, transfers) { + const callbackId = this.callbackId++; + const capability = Promise.withResolvers(); + this.callbackCapabilities[callbackId] = capability; + try { + this.comObj.postMessage({ + sourceName: this.sourceName, + targetName: this.targetName, + action: actionName, + callbackId, + data + }, transfers); + } catch (ex) { + capability.reject(ex); + } + return capability.promise; + } + sendWithStream(actionName, data, queueingStrategy, transfers) { + const streamId = this.streamId++, + sourceName = this.sourceName, + targetName = this.targetName, + comObj = this.comObj; + return new ReadableStream({ + start: controller => { + const startCapability = Promise.withResolvers(); + this.streamControllers[streamId] = { + controller, + startCall: startCapability, + pullCall: null, + cancelCall: null, + isClosed: false + }; + comObj.postMessage({ + sourceName, + targetName, + action: actionName, + streamId, + data, + desiredSize: controller.desiredSize + }, transfers); + return startCapability.promise; + }, + pull: controller => { + const pullCapability = Promise.withResolvers(); + this.streamControllers[streamId].pullCall = pullCapability; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL, + streamId, + desiredSize: controller.desiredSize + }); + return pullCapability.promise; + }, + cancel: reason => { + assert(reason instanceof Error, "cancel must have a valid reason"); + const cancelCapability = Promise.withResolvers(); + this.streamControllers[streamId].cancelCall = cancelCapability; + this.streamControllers[streamId].isClosed = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL, + streamId, + reason: wrapReason(reason) + }); + return cancelCapability.promise; + } + }, queueingStrategy); + } + #createStreamSink(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const self = this, + action = this.actionHandler[data.action]; + const streamSink = { + enqueue(chunk, size = 1, transfers) { + if (this.isCancelled) { + return; + } + const lastDesiredSize = this.desiredSize; + this.desiredSize -= size; + if (lastDesiredSize > 0 && this.desiredSize <= 0) { + this.sinkCapability = Promise.withResolvers(); + this.ready = this.sinkCapability.promise; + } + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ENQUEUE, + streamId, + chunk + }, transfers); + }, + close() { + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CLOSE, + streamId + }); + delete self.streamSinks[streamId]; + }, + error(reason) { + assert(reason instanceof Error, "error must have a valid reason"); + if (this.isCancelled) { + return; + } + this.isCancelled = true; + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.ERROR, + streamId, + reason: wrapReason(reason) + }); + }, + sinkCapability: Promise.withResolvers(), + onPull: null, + onCancel: null, + isCancelled: false, + desiredSize: data.desiredSize, + ready: null + }; + streamSink.sinkCapability.resolve(); + streamSink.ready = streamSink.sinkCapability.promise; + this.streamSinks[streamId] = streamSink; + Promise.try(action, data.data, streamSink).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.START_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + } + #processStreamMessage(data) { + const streamId = data.streamId, + sourceName = this.sourceName, + targetName = data.sourceName, + comObj = this.comObj; + const streamController = this.streamControllers[streamId], + streamSink = this.streamSinks[streamId]; + switch (data.stream) { + case StreamKind.START_COMPLETE: + if (data.success) { + streamController.startCall.resolve(); + } else { + streamController.startCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL_COMPLETE: + if (data.success) { + streamController.pullCall.resolve(); + } else { + streamController.pullCall.reject(wrapReason(data.reason)); + } + break; + case StreamKind.PULL: + if (!streamSink) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + break; + } + if (streamSink.desiredSize <= 0 && data.desiredSize > 0) { + streamSink.sinkCapability.resolve(); + } + streamSink.desiredSize = data.desiredSize; + Promise.try(streamSink.onPull || onFn).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.PULL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + break; + case StreamKind.ENQUEUE: + assert(streamController, "enqueue should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.controller.enqueue(data.chunk); + break; + case StreamKind.CLOSE: + assert(streamController, "close should have stream controller"); + if (streamController.isClosed) { + break; + } + streamController.isClosed = true; + streamController.controller.close(); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.ERROR: + assert(streamController, "error should have stream controller"); + streamController.controller.error(wrapReason(data.reason)); + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL_COMPLETE: + if (data.success) { + streamController.cancelCall.resolve(); + } else { + streamController.cancelCall.reject(wrapReason(data.reason)); + } + this.#deleteStreamController(streamController, streamId); + break; + case StreamKind.CANCEL: + if (!streamSink) { + break; + } + const dataReason = wrapReason(data.reason); + Promise.try(streamSink.onCancel || onFn, dataReason).then(function () { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + success: true + }); + }, function (reason) { + comObj.postMessage({ + sourceName, + targetName, + stream: StreamKind.CANCEL_COMPLETE, + streamId, + reason: wrapReason(reason) + }); + }); + streamSink.sinkCapability.reject(dataReason); + streamSink.isCancelled = true; + delete this.streamSinks[streamId]; + break; + default: + throw new Error("Unexpected stream case"); + } + } + async #deleteStreamController(streamController, streamId) { + await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]); + delete this.streamControllers[streamId]; + } + destroy() { + this.#messageAC?.abort(); + this.#messageAC = null; + } +} + +;// ./src/display/canvas_factory.js + +class BaseCanvasFactory { + #enableHWA = false; + constructor({ + enableHWA = false + }) { + this.#enableHWA = enableHWA; + } + 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", { + willReadFrequently: !this.#enableHWA + }) + }; + } + 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) { + unreachable("Abstract method `_createCanvas` called."); + } +} +class DOMCanvasFactory extends BaseCanvasFactory { + constructor({ + ownerDocument = globalThis.document, + enableHWA = false + }) { + super({ + enableHWA + }); + this._document = ownerDocument; + } + _createCanvas(width, height) { + const canvas = this._document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + return canvas; + } +} + +;// ./src/display/cmap_reader_factory.js + + +class BaseCMapReaderFactory { + constructor({ + baseUrl = null, + isCompressed = true + }) { + this.baseUrl = baseUrl; + this.isCompressed = isCompressed; + } + async fetch({ + name + }) { + if (!this.baseUrl) { + throw new Error("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" : ""); + return this._fetch(url).then(cMapData => ({ + cMapData, + isCompressed: this.isCompressed + })).catch(reason => { + throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + const data = await fetchData(url, this.isCompressed ? "arraybuffer" : "text"); + return data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data); + } +} + +;// ./src/display/filter_factory.js + + +class BaseFilterFactory { + addFilter(maps) { + return "none"; + } + addHCMFilter(fgColor, bgColor) { + return "none"; + } + addAlphaFilter(map) { + return "none"; + } + addLuminosityFilter(map) { + return "none"; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + return "none"; + } + destroy(keepHCM = false) {} +} +class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; + #_defs; + #docId; + #document; + #_hcmCache; + #id = 0; + constructor({ + docId, + ownerDocument = globalThis.document + }) { + super(); + this.#docId = docId; + this.#document = ownerDocument; + } + get #cache() { + return this.#_cache ||= new Map(); + } + get #hcmCache() { + return this.#_hcmCache ||= new Map(); + } + get #defs() { + if (!this.#_defs) { + const div = this.#document.createElement("div"); + const { + style + } = div; + style.visibility = "hidden"; + style.contain = "strict"; + style.width = style.height = 0; + style.position = "absolute"; + style.top = style.left = 0; + style.zIndex = -1; + const svg = this.#document.createElementNS(SVG_NS, "svg"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + this.#_defs = this.#document.createElementNS(SVG_NS, "defs"); + div.append(svg); + svg.append(this.#_defs); + this.#document.body.append(div); + } + return this.#_defs; + } + #createTables(maps) { + if (maps.length === 1) { + const mapR = maps[0]; + const buffer = new Array(256); + for (let i = 0; i < 256; i++) { + buffer[i] = mapR[i] / 255; + } + const table = buffer.join(","); + return [table, table, table]; + } + const [mapR, mapG, mapB] = maps; + const bufferR = new Array(256); + const bufferG = new Array(256); + const bufferB = new Array(256); + for (let i = 0; i < 256; i++) { + bufferR[i] = mapR[i] / 255; + bufferG[i] = mapG[i] / 255; + bufferB[i] = mapB[i] / 255; + } + return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; + } + #createUrl(id) { + if (this.#baseUrl === undefined) { + this.#baseUrl = ""; + const url = this.#document.URL; + if (url !== this.#document.baseURI) { + if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + } else { + this.#baseUrl = updateUrlHash(url, ""); + } + } + } + return `url(${this.#baseUrl}#${id})`; + } + addFilter(maps) { + if (!maps) { + return "none"; + } + let value = this.#cache.get(maps); + if (value) { + return value; + } + const [tableR, tableG, tableB] = this.#createTables(maps); + const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(maps, value); + return value; + } + const id = `g_${this.#docId}_transfer_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(maps, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapConversion(tableR, tableG, tableB, filter); + return url; + } + addHCMFilter(fgColor, bgColor) { + const key = `${fgColor}-${bgColor}`; + const filterName = "base"; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const fgRGB = this.#getRGB(fgColor); + fgColor = Util.makeHexColor(...fgRGB); + const bgRGB = this.#getRGB(bgColor); + bgColor = Util.makeHexColor(...bgRGB); + this.#defs.style.color = ""; + if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) { + return info.url; + } + const map = new Array(256); + for (let i = 0; i <= 255; i++) { + const x = i / 255; + map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4; + } + const table = map.join(","); + const id = `g_${this.#docId}_hcm_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addTransferMapConversion(table, table, table, filter); + this.#addGrayConversion(filter); + const getSteps = (c, n) => { + const start = fgRGB[c] / 255; + const end = bgRGB[c] / 255; + const arr = new Array(n + 1); + for (let i = 0; i <= n; i++) { + arr[i] = start + i / n * (end - start); + } + return arr.join(","); + }; + this.#addTransferMapConversion(getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + addAlphaFilter(map) { + let value = this.#cache.get(map); + if (value) { + return value; + } + const [tableA] = this.#createTables([map]); + const key = `alpha_${tableA}`; + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_alpha_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addTransferMapAlphaConversion(tableA, filter); + return url; + } + addLuminosityFilter(map) { + let value = this.#cache.get(map || "luminosity"); + if (value) { + return value; + } + let tableA, key; + if (map) { + [tableA] = this.#createTables([map]); + key = `luminosity_${tableA}`; + } else { + key = "luminosity"; + } + value = this.#cache.get(key); + if (value) { + this.#cache.set(map, value); + return value; + } + const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; + const url = this.#createUrl(id); + this.#cache.set(map, url); + this.#cache.set(key, url); + const filter = this.#createFilter(id); + this.#addLuminosityConversion(filter); + if (map) { + this.#addTransferMapAlphaConversion(tableA, filter); + } + return url; + } + addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) { + const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`; + let info = this.#hcmCache.get(filterName); + if (info?.key === key) { + return info.url; + } + if (info) { + info.filter?.remove(); + info.key = key; + info.url = "none"; + info.filter = null; + } else { + info = { + key, + url: "none", + filter: null + }; + this.#hcmCache.set(filterName, info); + } + if (!fgColor || !bgColor) { + return info.url; + } + const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this)); + let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]); + let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]); + let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(this.#getRGB.bind(this)); + if (bgGray < fgGray) { + [fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB]; + } + this.#defs.style.color = ""; + const getSteps = (fg, bg, n) => { + const arr = new Array(256); + const step = (bgGray - fgGray) / n; + const newStart = fg / 255; + const newStep = (bg - fg) / (255 * n); + let prev = 0; + for (let i = 0; i <= n; i++) { + const k = Math.round(fgGray + i * step); + const value = newStart + i * newStep; + for (let j = prev; j <= k; j++) { + arr[j] = value; + } + prev = k + 1; + } + for (let i = prev; i < 256; i++) { + arr[i] = arr[prev - 1]; + } + return arr.join(","); + }; + const id = `g_${this.#docId}_hcm_${filterName}_filter`; + const filter = info.filter = this.#createFilter(id); + this.#addGrayConversion(filter); + this.#addTransferMapConversion(getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter); + info.url = this.#createUrl(id); + return info.url; + } + destroy(keepHCM = false) { + if (keepHCM && this.#_hcmCache?.size) { + return; + } + this.#_defs?.parentNode.parentNode.remove(); + this.#_defs = null; + this.#_cache?.clear(); + this.#_cache = null; + this.#_hcmCache?.clear(); + this.#_hcmCache = null; + this.#id = 0; + } + #addLuminosityConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0"); + filter.append(feColorMatrix); + } + #addGrayConversion(filter) { + const feColorMatrix = this.#document.createElementNS(SVG_NS, "feColorMatrix"); + feColorMatrix.setAttribute("type", "matrix"); + feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0"); + filter.append(feColorMatrix); + } + #createFilter(id) { + const filter = this.#document.createElementNS(SVG_NS, "filter"); + filter.setAttribute("color-interpolation-filters", "sRGB"); + filter.setAttribute("id", id); + this.#defs.append(filter); + return filter; + } + #appendFeFunc(feComponentTransfer, func, table) { + const feFunc = this.#document.createElementNS(SVG_NS, func); + feFunc.setAttribute("type", "discrete"); + feFunc.setAttribute("tableValues", table); + feComponentTransfer.append(feFunc); + } + #addTransferMapConversion(rTable, gTable, bTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncR", rTable); + this.#appendFeFunc(feComponentTransfer, "feFuncG", gTable); + this.#appendFeFunc(feComponentTransfer, "feFuncB", bTable); + } + #addTransferMapAlphaConversion(aTable, filter) { + const feComponentTransfer = this.#document.createElementNS(SVG_NS, "feComponentTransfer"); + filter.append(feComponentTransfer); + this.#appendFeFunc(feComponentTransfer, "feFuncA", aTable); + } + #getRGB(color) { + this.#defs.style.color = color; + return getRGB(getComputedStyle(this.#defs).getPropertyValue("color")); + } +} + +;// ./src/display/standard_fontdata_factory.js + + +class BaseStandardFontDataFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("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._fetch(url).catch(reason => { + throw new Error(`Unable to load font data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/wasm_factory.js + + +class BaseWasmFactory { + constructor({ + baseUrl = null + }) { + this.baseUrl = baseUrl; + } + async fetch({ + filename + }) { + if (!this.baseUrl) { + throw new Error("Ensure that the `wasmUrl` API parameter is provided."); + } + if (!filename) { + throw new Error("Wasm filename must be specified."); + } + const url = `${this.baseUrl}${filename}`; + return this._fetch(url).catch(reason => { + throw new Error(`Unable to load wasm data at: ${url}`); + }); + } + async _fetch(url) { + unreachable("Abstract method `_fetch` called."); + } +} +class DOMWasmFactory extends BaseWasmFactory { + async _fetch(url) { + const data = await fetchData(url, "arraybuffer"); + return new Uint8Array(data); + } +} + +;// ./src/display/node_utils.js + + + + + + +if (isNodeJS) { + warn("Please use the `legacy` build in Node.js environments."); +} +async function node_utils_fetchData(url) { + const fs = process.getBuiltinModule("fs"); + const data = await fs.promises.readFile(url); + return new Uint8Array(data); +} +class NodeFilterFactory extends BaseFilterFactory {} +class NodeCanvasFactory extends BaseCanvasFactory { + _createCanvas(width, height) { + const require = process.getBuiltinModule("module").createRequire(import.meta.url); + const canvas = require("@napi-rs/canvas"); + return canvas.createCanvas(width, height); + } +} +class NodeCMapReaderFactory extends BaseCMapReaderFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeStandardFontDataFactory extends BaseStandardFontDataFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} +class NodeWasmFactory extends BaseWasmFactory { + async _fetch(url) { + return node_utils_fetchData(url); + } +} + +;// ./src/display/canvas_dependency_tracker.js + +const FORCED_DEPENDENCY_LABEL = "__forcedDependency"; +const { + floor, + ceil +} = Math; +function expandBBox(array, index, minX, minY, maxX, maxY) { + array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX); + array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY); + array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX); + array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY); +} +const EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0]; +class BBoxReader { + #bboxes; + #coords; + constructor(bboxes, coords) { + this.#bboxes = bboxes; + this.#coords = coords; + } + get length() { + return this.#bboxes.length; + } + isEmpty(i) { + return this.#bboxes[i] === EMPTY_BBOX; + } + minX(i) { + return this.#coords[i * 4 + 0] / 256; + } + minY(i) { + return this.#coords[i * 4 + 1] / 256; + } + maxX(i) { + return (this.#coords[i * 4 + 2] + 1) / 256; + } + maxY(i) { + return (this.#coords[i * 4 + 3] + 1) / 256; + } +} +const ensureDebugMetadata = (map, key) => { + if (!map) { + return undefined; + } + let value = map.get(key); + if (!value) { + value = { + dependencies: new Set(), + isRenderingOperation: false + }; + map.set(key, value); + } + return value; +}; +class CanvasDependencyTracker { + #simple = { + __proto__: null + }; + #incremental = { + __proto__: null, + transform: [], + moveText: [], + sameLineText: [], + [FORCED_DEPENDENCY_LABEL]: [] + }; + #namedDependencies = new Map(); + #savesStack = []; + #markedContentStack = []; + #baseTransformStack = [[1, 0, 0, 1, 0, 0]]; + #clipBox = [-Infinity, -Infinity, Infinity, Infinity]; + #pendingBBox = new Float64Array([Infinity, Infinity, -Infinity, -Infinity]); + #pendingBBoxIdx = -1; + #pendingDependencies = new Set(); + #operations = new Map(); + #fontBBoxTrustworthy = new Map(); + #canvasWidth; + #canvasHeight; + #bboxesCoords; + #bboxes; + #debugMetadata; + constructor(canvas, operationsCount, recordDebugMetadata = false) { + this.#canvasWidth = canvas.width; + this.#canvasHeight = canvas.height; + this.#initializeBBoxes(operationsCount); + if (recordDebugMetadata) { + this.#debugMetadata = new Map(); + } + } + growOperationsCount(operationsCount) { + if (operationsCount >= this.#bboxes.length) { + this.#initializeBBoxes(operationsCount, this.#bboxes); + } + } + #initializeBBoxes(operationsCount, oldBBoxes) { + const buffer = new ArrayBuffer(operationsCount * 4); + this.#bboxesCoords = new Uint8ClampedArray(buffer); + this.#bboxes = new Uint32Array(buffer); + if (oldBBoxes && oldBBoxes.length > 0) { + this.#bboxes.set(oldBBoxes); + this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length); + } else { + this.#bboxes.fill(EMPTY_BBOX); + } + } + save(opIdx) { + this.#simple = { + __proto__: this.#simple + }; + this.#incremental = { + __proto__: this.#incremental, + transform: { + __proto__: this.#incremental.transform + }, + moveText: { + __proto__: this.#incremental.moveText + }, + sameLineText: { + __proto__: this.#incremental.sameLineText + }, + [FORCED_DEPENDENCY_LABEL]: { + __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL] + } + }; + this.#clipBox = { + __proto__: this.#clipBox + }; + this.#savesStack.push(opIdx); + return this; + } + restore(opIdx) { + const previous = Object.getPrototypeOf(this.#simple); + if (previous === null) { + return this; + } + this.#simple = previous; + this.#incremental = Object.getPrototypeOf(this.#incremental); + this.#clipBox = Object.getPrototypeOf(this.#clipBox); + const lastSave = this.#savesStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(lastSave); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + recordOpenMarker(idx) { + this.#savesStack.push(idx); + return this; + } + getOpenMarker() { + if (this.#savesStack.length === 0) { + return null; + } + return this.#savesStack.at(-1); + } + recordCloseMarker(opIdx) { + const lastSave = this.#savesStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(lastSave); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + beginMarkedContent(opIdx) { + this.#markedContentStack.push(opIdx); + return this; + } + endMarkedContent(opIdx) { + const lastSave = this.#markedContentStack.pop(); + if (lastSave !== undefined) { + ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(lastSave); + this.#bboxes[opIdx] = this.#bboxes[lastSave]; + } + return this; + } + pushBaseTransform(ctx) { + this.#baseTransformStack.push(Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform())); + return this; + } + popBaseTransform() { + if (this.#baseTransformStack.length > 1) { + this.#baseTransformStack.pop(); + } + return this; + } + recordSimpleData(name, idx) { + this.#simple[name] = idx; + return this; + } + recordIncrementalData(name, idx) { + this.#incremental[name].push(idx); + return this; + } + resetIncrementalData(name, idx) { + this.#incremental[name].length = 0; + return this; + } + recordNamedData(name, idx) { + this.#namedDependencies.set(name, idx); + return this; + } + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx; + } + recordFutureForcedDependency(name, idx) { + this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx); + return this; + } + inheritSimpleDataAsFutureForcedDependencies(names) { + for (const name of names) { + if (name in this.#simple) { + this.recordFutureForcedDependency(name, this.#simple[name]); + } + } + return this; + } + inheritPendingDependenciesAsFutureForcedDependencies() { + for (const dep of this.#pendingDependencies) { + this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep); + } + return this; + } + resetBBox(idx) { + if (this.#pendingBBoxIdx !== idx) { + this.#pendingBBoxIdx = idx; + this.#pendingBBox[0] = Infinity; + this.#pendingBBox[1] = Infinity; + this.#pendingBBox[2] = -Infinity; + this.#pendingBBox[3] = -Infinity; + } + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + const clipBox = [Infinity, Infinity, -Infinity, -Infinity]; + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox); + const intersection = Util.intersect(this.#clipBox, clipBox); + if (intersection) { + this.#clipBox[0] = intersection[0]; + this.#clipBox[1] = intersection[1]; + this.#clipBox[2] = intersection[2]; + this.#clipBox[3] = intersection[3]; + } else { + this.#clipBox[0] = this.#clipBox[1] = Infinity; + this.#clipBox[2] = this.#clipBox[3] = -Infinity; + } + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + const clipBox = this.#clipBox; + if (clipBox[0] === Infinity) { + return this; + } + const transform = Util.multiplyByDOMMatrix(this.#baseTransformStack.at(-1), ctx.getTransform()); + if (clipBox[0] === -Infinity) { + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, this.#pendingBBox); + return this; + } + const bbox = [Infinity, Infinity, -Infinity, -Infinity]; + Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox); + this.#pendingBBox[0] = Math.min(this.#pendingBBox[0], Math.max(bbox[0], clipBox[0])); + this.#pendingBBox[1] = Math.min(this.#pendingBBox[1], Math.max(bbox[1], clipBox[1])); + this.#pendingBBox[2] = Math.max(this.#pendingBBox[2], Math.min(bbox[2], clipBox[2])); + this.#pendingBBox[3] = Math.max(this.#pendingBBox[3], Math.min(bbox[3], clipBox[3])); + return this; + } + recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) { + const fontBBox = font.bbox; + let isBBoxTrustworthy; + let computedBBox; + if (fontBBox) { + isBBoxTrustworthy = fontBBox[2] !== fontBBox[0] && fontBBox[3] !== fontBBox[1] && this.#fontBBoxTrustworthy.get(font); + if (isBBoxTrustworthy !== false) { + computedBBox = [0, 0, 0, 0]; + Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox); + if (scale !== 1 || x !== 0 || y !== 0) { + Util.scaleMinMax([scale, 0, 0, -scale, x, y], computedBBox); + } + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + } + if (!getMeasure) { + return this.recordFullPageBBox(idx); + } + const measure = getMeasure(); + if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) { + isBBoxTrustworthy = computedBBox[0] <= x - measure.actualBoundingBoxLeft && computedBBox[2] >= x + measure.actualBoundingBoxRight && computedBBox[1] <= y - measure.actualBoundingBoxAscent && computedBBox[3] >= y + measure.actualBoundingBoxDescent; + this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy); + if (isBBoxTrustworthy) { + return this.recordBBox(idx, ctx, computedBBox[0], computedBBox[2], computedBBox[1], computedBBox[3]); + } + } + return this.recordBBox(idx, ctx, x - measure.actualBoundingBoxLeft, x + measure.actualBoundingBoxRight, y - measure.actualBoundingBoxAscent, y + measure.actualBoundingBoxDescent); + } + recordFullPageBBox(idx) { + this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]); + this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]); + this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]); + this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]); + return this; + } + getSimpleIndex(dependencyName) { + return this.#simple[dependencyName]; + } + recordDependencies(idx, dependencyNames) { + const pendingDependencies = this.#pendingDependencies; + const simple = this.#simple; + const incremental = this.#incremental; + for (const name of dependencyNames) { + if (name in this.#simple) { + pendingDependencies.add(simple[name]); + } else if (name in incremental) { + incremental[name].forEach(pendingDependencies.add, pendingDependencies); + } + } + return this; + } + recordNamedDependency(idx, name) { + if (this.#namedDependencies.has(name)) { + this.#pendingDependencies.add(this.#namedDependencies.get(name)); + } + return this; + } + recordOperation(idx, preserve = false) { + this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]); + if (this.#debugMetadata) { + const metadata = ensureDebugMetadata(this.#debugMetadata, idx); + const { + dependencies + } = metadata; + this.#pendingDependencies.forEach(dependencies.add, dependencies); + this.#savesStack.forEach(dependencies.add, dependencies); + this.#markedContentStack.forEach(dependencies.add, dependencies); + dependencies.delete(idx); + metadata.isRenderingOperation = true; + } + if (this.#pendingBBoxIdx === idx) { + const minX = floor(this.#pendingBBox[0] * 256 / this.#canvasWidth); + const minY = floor(this.#pendingBBox[1] * 256 / this.#canvasHeight); + const maxX = ceil(this.#pendingBBox[2] * 256 / this.#canvasWidth); + const maxY = ceil(this.#pendingBBox[3] * 256 / this.#canvasHeight); + expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY); + for (const depIdx of this.#pendingDependencies) { + if (depIdx !== idx) { + expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY); + } + } + for (const saveIdx of this.#savesStack) { + if (saveIdx !== idx) { + expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY); + } + } + for (const saveIdx of this.#markedContentStack) { + if (saveIdx !== idx) { + expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY); + } + } + if (!preserve) { + this.#pendingDependencies.clear(); + this.#pendingBBoxIdx = -1; + } + } + return this; + } + recordShowTextOperation(idx, preserve = false) { + const deps = Array.from(this.#pendingDependencies); + this.recordOperation(idx, preserve); + this.recordIncrementalData("sameLineText", idx); + for (const dep of deps) { + this.recordIncrementalData("sameLineText", dep); + } + return this; + } + bboxToClipBoxDropOperation(idx, preserve = false) { + if (this.#pendingBBoxIdx === idx) { + this.#pendingBBoxIdx = -1; + this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]); + this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]); + this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]); + this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]); + if (!preserve) { + this.#pendingDependencies.clear(); + } + } + return this; + } + _takePendingDependencies() { + const pendingDependencies = this.#pendingDependencies; + this.#pendingDependencies = new Set(); + return pendingDependencies; + } + _extractOperation(idx) { + const operation = this.#operations.get(idx); + this.#operations.delete(idx); + return operation; + } + _pushPendingDependencies(dependencies) { + for (const dep of dependencies) { + this.#pendingDependencies.add(dep); + } + } + take() { + this.#fontBBoxTrustworthy.clear(); + return new BBoxReader(this.#bboxes, this.#bboxesCoords); + } + takeDebugMetadata() { + return this.#debugMetadata; + } +} +class CanvasNestedDependencyTracker { + #dependencyTracker; + #opIdx; + #ignoreBBoxes; + #nestingLevel = 0; + #savesLevel = 0; + constructor(dependencyTracker, opIdx, ignoreBBoxes) { + if (dependencyTracker instanceof CanvasNestedDependencyTracker && dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes) { + return dependencyTracker; + } + this.#dependencyTracker = dependencyTracker; + this.#opIdx = opIdx; + this.#ignoreBBoxes = !!ignoreBBoxes; + } + growOperationsCount() { + throw new Error("Unreachable"); + } + save(opIdx) { + this.#savesLevel++; + this.#dependencyTracker.save(this.#opIdx); + return this; + } + restore(opIdx) { + if (this.#savesLevel > 0) { + this.#dependencyTracker.restore(this.#opIdx); + this.#savesLevel--; + } + return this; + } + recordOpenMarker(idx) { + this.#nestingLevel++; + return this; + } + getOpenMarker() { + return this.#nestingLevel > 0 ? this.#opIdx : this.#dependencyTracker.getOpenMarker(); + } + recordCloseMarker(idx) { + this.#nestingLevel--; + return this; + } + beginMarkedContent(opIdx) { + return this; + } + endMarkedContent(opIdx) { + return this; + } + pushBaseTransform(ctx) { + this.#dependencyTracker.pushBaseTransform(ctx); + return this; + } + popBaseTransform() { + this.#dependencyTracker.popBaseTransform(); + return this; + } + recordSimpleData(name, idx) { + this.#dependencyTracker.recordSimpleData(name, this.#opIdx); + return this; + } + recordIncrementalData(name, idx) { + this.#dependencyTracker.recordIncrementalData(name, this.#opIdx); + return this; + } + resetIncrementalData(name, idx) { + this.#dependencyTracker.resetIncrementalData(name, this.#opIdx); + return this; + } + recordNamedData(name, idx) { + return this; + } + recordSimpleDataFromNamed(name, depName, fallbackIdx) { + this.#dependencyTracker.recordSimpleDataFromNamed(name, depName, this.#opIdx); + return this; + } + recordFutureForcedDependency(name, idx) { + this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx); + return this; + } + inheritSimpleDataAsFutureForcedDependencies(names) { + this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names); + return this; + } + inheritPendingDependenciesAsFutureForcedDependencies() { + this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies(); + return this; + } + resetBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.resetBBox(this.#opIdx); + } + return this; + } + recordClipBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordClipBox(this.#opIdx, ctx, minX, maxX, minY, maxY); + } + return this; + } + recordBBox(idx, ctx, minX, maxX, minY, maxY) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordBBox(this.#opIdx, ctx, minX, maxX, minY, maxY); + } + return this; + } + recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordCharacterBBox(this.#opIdx, ctx, font, scale, x, y, getMeasure); + } + return this; + } + recordFullPageBBox(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.recordFullPageBBox(this.#opIdx); + } + return this; + } + getSimpleIndex(dependencyName) { + return this.#dependencyTracker.getSimpleIndex(dependencyName); + } + recordDependencies(idx, dependencyNames) { + this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames); + return this; + } + recordNamedDependency(idx, name) { + this.#dependencyTracker.recordNamedDependency(this.#opIdx, name); + return this; + } + recordOperation(idx) { + this.#dependencyTracker.recordOperation(this.#opIdx, true); + return this; + } + recordShowTextOperation(idx) { + this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true); + return this; + } + bboxToClipBoxDropOperation(idx) { + if (!this.#ignoreBBoxes) { + this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true); + } + return this; + } + take() { + throw new Error("Unreachable"); + } + takeDebugMetadata() { + throw new Error("Unreachable"); + } +} +const Dependencies = { + stroke: ["path", "transform", "filter", "strokeColor", "strokeAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "dash"], + fill: ["path", "transform", "filter", "fillColor", "fillAlpha", "globalCompositeOperation", "SMask"], + imageXObject: ["transform", "SMask", "filter", "fillAlpha", "strokeAlpha", "globalCompositeOperation"], + rawFillPath: ["filter", "fillColor", "fillAlpha"], + showText: ["transform", "leading", "charSpacing", "wordSpacing", "hScale", "textRise", "moveText", "textMatrix", "font", "fontObj", "filter", "fillColor", "textRenderingMode", "SMask", "fillAlpha", "strokeAlpha", "globalCompositeOperation", "sameLineText"], + transform: ["transform"], + transformAndFill: ["transform", "fillColor"] +}; + +;// ./src/display/pattern_helper.js + + +const PathType = { + FILL: "Fill", + STROKE: "Stroke", + SHADING: "Shading" +}; +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 { + isModifyingCurrentTransform() { + return false; + } + getPattern() { + 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, 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); + 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.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) { + const k = y < y1 ? 0 : (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[6]; + this._background = IR[7]; + 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); + 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 + }; + } + isModifyingCurrentTransform() { + return true; + } + getPattern(ctx, owner, inverse, pathType) { + applyBoundingBox(ctx, this._bbox); + const scale = new Float32Array(2); + if (pathType === PathType.SHADING) { + Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale); + } else if (this.matrix) { + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + scale[0] *= matrixScaleX; + scale[1] *= matrixScaleY; + } else { + Util.singularValueDecompose2dScale(owner.baseTransform, scale); + } + 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 MAX_PATTERN_SIZE = 3000; + constructor(IR, ctx, canvasGraphicsFactory, baseTransform) { + this.color = IR[1]; + this.operatorList = IR[2]; + this.matrix = IR[3]; + this.bbox = IR[4]; + this.xstep = IR[5]; + this.ystep = IR[6]; + this.paintType = IR[7]; + this.tilingType = IR[8]; + this.ctx = ctx; + this.canvasGraphicsFactory = canvasGraphicsFactory; + this.baseTransform = baseTransform; + } + createPatternCanvas(owner, opIdx) { + const { + bbox, + operatorList, + paintType, + tilingType, + color, + canvasGraphicsFactory + } = this; + let { + xstep, + ystep + } = this; + xstep = Math.abs(xstep); + ystep = Math.abs(ystep); + info("TilingType: " + tilingType); + const x0 = bbox[0], + y0 = bbox[1], + x1 = bbox[2], + y1 = bbox[3]; + const width = x1 - x0; + const height = y1 - y0; + const scale = new Float32Array(2); + Util.singularValueDecompose2dScale(this.matrix, scale); + const [matrixScaleX, matrixScaleY] = scale; + Util.singularValueDecompose2dScale(this.baseTransform, scale); + const combinedScaleX = matrixScaleX * scale[0]; + const combinedScaleY = matrixScaleY * scale[1]; + let canvasWidth = width, + canvasHeight = height, + redrawHorizontally = false, + redrawVertically = false; + const xScaledStep = Math.ceil(xstep * combinedScaleX); + const yScaledStep = Math.ceil(ystep * combinedScaleY); + const xScaledWidth = Math.ceil(width * combinedScaleX); + const yScaledHeight = Math.ceil(height * combinedScaleY); + if (xScaledStep >= xScaledWidth) { + canvasWidth = xstep; + } else { + redrawHorizontally = true; + } + if (yScaledStep >= yScaledHeight) { + canvasHeight = ystep; + } else { + redrawVertically = true; + } + const dimx = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size); + const tmpCtx = tmpCanvas.context; + const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx); + graphics.groupLevel = owner.groupLevel; + this.setFillAndStrokeStyleToContext(graphics, paintType, color); + tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0); + graphics.transform(0, dimx.scale, 0, 0, dimy.scale, 0, 0); + tmpCtx.save(); + graphics.dependencyTracker?.save(); + this.clipBbox(graphics, x0, y0, x1, y1); + graphics.baseTransform = getCurrentTransform(graphics.ctx); + graphics.executeOperatorList(operatorList); + graphics.endDrawing(); + graphics.dependencyTracker?.restore(); + tmpCtx.restore(); + if (redrawHorizontally || redrawVertically) { + const image = tmpCanvas.canvas; + if (redrawHorizontally) { + canvasWidth = xstep; + } + if (redrawVertically) { + canvasHeight = ystep; + } + const dimx2 = this.getSizeAndScale(canvasWidth, this.ctx.canvas.width, combinedScaleX); + const dimy2 = this.getSizeAndScale(canvasHeight, this.ctx.canvas.height, combinedScaleY); + const xSize = dimx2.size; + const ySize = dimy2.size; + const tmpCanvas2 = owner.cachedCanvases.getCanvas("pattern-workaround", xSize, ySize); + const tmpCtx2 = tmpCanvas2.context; + const ii = redrawHorizontally ? Math.floor(width / xstep) : 0; + const jj = redrawVertically ? Math.floor(height / ystep) : 0; + for (let i = 0; i <= ii; i++) { + for (let j = 0; j <= jj; j++) { + tmpCtx2.drawImage(image, xSize * i, ySize * j, xSize, ySize, 0, 0, xSize, ySize); + } + } + return { + canvas: tmpCanvas2.canvas, + scaleX: dimx2.scale, + scaleY: dimy2.scale, + offsetX: x0, + offsetY: y0 + }; + } + return { + canvas: tmpCanvas.canvas, + scaleX: dimx.scale, + scaleY: dimy.scale, + offsetX: x0, + offsetY: y0 + }; + } + getSizeAndScale(step, realOutputSize, scale) { + 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); + Util.axialAlignedBoundingBox([x0, y0, x1, y1], getCurrentTransform(graphics.ctx), graphics.current.minMax); + graphics.clip(); + graphics.endPath(); + } + setFillAndStrokeStyleToContext(graphics, paintType, color) { + const context = graphics.ctx, + current = graphics.current; + switch (paintType) { + case PaintType.COLORED: + const { + fillStyle, + strokeStyle + } = this.ctx; + context.fillStyle = current.fillColor = fillStyle; + context.strokeStyle = current.strokeColor = strokeStyle; + break; + case PaintType.UNCOLORED: + context.fillStyle = context.strokeStyle = color; + current.fillColor = current.strokeColor = color; + break; + default: + throw new FormatError(`Unsupported paint type: ${paintType}`); + } + } + isModifyingCurrentTransform() { + return false; + } + getPattern(ctx, owner, inverse, pathType, opIdx) { + let matrix = inverse; + if (pathType !== PathType.SHADING) { + matrix = Util.transform(matrix, owner.baseTransform); + if (this.matrix) { + matrix = Util.transform(matrix, this.matrix); + } + } + const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx); + 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; + } +} + +;// ./src/shared/image_utils.js + +function convertToRGBA(params) { + switch (params.kind) { + case ImageKind.GRAYSCALE_1BPP: + return convertBlackAndWhiteToRGBA(params); + case ImageKind.RGB_24BPP: + return convertRGBToRGBA(params); + } + return null; +} +function convertBlackAndWhiteToRGBA({ + src, + srcPos = 0, + dest, + width, + height, + nonBlackColor = 0xffffffff, + inverseDecode = false +}) { + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor]; + const widthInSource = width >> 3; + const widthRemainder = width & 7; + const srcLength = src.length; + dest = new Uint32Array(dest.buffer); + let destPos = 0; + for (let i = 0; i < height; i++) { + for (const max = srcPos + widthInSource; srcPos < max; srcPos++) { + const elem = srcPos < srcLength ? src[srcPos] : 255; + dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping; + dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping; + } + if (widthRemainder === 0) { + continue; + } + const elem = srcPos < srcLength ? src[srcPos++] : 255; + for (let j = 0; j < widthRemainder; j++) { + dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping; + } + } + return { + srcPos, + destPos + }; +} +function convertRGBToRGBA({ + src, + srcPos = 0, + dest, + destPos = 0, + width, + height +}) { + let i = 0; + const len = width * height * 3; + const len32 = len >> 2; + const src32 = new Uint32Array(src.buffer, srcPos, len32); + if (FeatureTest.isLittleEndian) { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff000000; + dest[destPos + 1] = s1 >>> 24 | s2 << 8 | 0xff000000; + dest[destPos + 2] = s2 >>> 16 | s3 << 16 | 0xff000000; + dest[destPos + 3] = s3 >>> 8 | 0xff000000; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] | src[j + 1] << 8 | src[j + 2] << 16 | 0xff000000; + } + } else { + for (; i < len32 - 2; i += 3, destPos += 4) { + const s1 = src32[i]; + const s2 = src32[i + 1]; + const s3 = src32[i + 2]; + dest[destPos] = s1 | 0xff; + dest[destPos + 1] = s1 << 24 | s2 >>> 8 | 0xff; + dest[destPos + 2] = s2 << 16 | s3 >>> 16 | 0xff; + dest[destPos + 3] = s3 << 8 | 0xff; + } + for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) { + dest[destPos++] = src[j] << 24 | src[j + 1] << 16 | src[j + 2] << 8 | 0xff; + } + } + return { + srcPos: srcPos + len, + destPos + }; +} +function grayToRGBA(src, dest) { + if (FeatureTest.isLittleEndian) { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x10101 | 0xff000000; + } + } else { + for (let i = 0, ii = src.length; i < ii; i++) { + dest[i] = src[i] * 0x1010100 | 0x000000ff; + } + } +} + +;// ./src/display/canvas.js + + + + + +const MIN_FONT_SIZE = 16; +const MAX_FONT_SIZE = 100; +const EXECUTION_TIME = 15; +const EXECUTION_STEPS = 10; +const FULL_CHUNK_HEIGHT = 16; +const SCALE_MATRIX = new DOMMatrix(); +const XY = new Float32Array(2); +const MIN_MAX_INIT = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); +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 () { + destCtx.save(); + this.__originalSave(); + }; + ctx.restore = function () { + destCtx.restore(); + this.__originalRestore(); + }; + ctx.translate = function (x, y) { + destCtx.translate(x, y); + this.__originalTranslate(x, y); + }; + ctx.scale = function (x, y) { + destCtx.scale(x, y); + this.__originalScale(x, y); + }; + ctx.transform = function (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 (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 () { + destCtx.resetTransform(); + this.__originalResetTransform(); + }; + ctx.rotate = function (angle) { + destCtx.rotate(angle); + this.__originalRotate(angle); + }; + ctx.clip = function (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] = 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]; +} +class CanvasExtraState { + alphaIsShape = false; + fontSize = 0; + fontSizeScale = 1; + textMatrix = null; + textMatrixScale = 1; + fontMatrix = FONT_IDENTITY_MATRIX; + leading = 0; + x = 0; + y = 0; + lineX = 0; + lineY = 0; + charSpacing = 0; + wordSpacing = 0; + textHScale = 1; + textRenderingMode = TextRenderingMode.FILL; + textRise = 0; + fillColor = "#000000"; + strokeColor = "#000000"; + patternFill = false; + patternStroke = false; + fillAlpha = 1; + strokeAlpha = 1; + lineWidth = 1; + activeSMask = null; + transferMaps = "none"; + constructor(width, height, preInit) { + preInit?.(this); + this.clipBox = new Float32Array([0, 0, width, height]); + this.minMax = MIN_MAX_INIT.slice(); + } + clone() { + const clone = Object.create(this); + clone.clipBox = this.clipBox.slice(); + clone.minMax = this.minMax.slice(); + return clone; + } + getPathBoundingBox(pathType = PathType.FILL, transform = null) { + const box = this.minMax.slice(); + if (pathType === PathType.STROKE) { + if (!transform) { + unreachable("Stroke bounding box must include transform."); + } + Util.singularValueDecompose2dScale(transform, XY); + const xStrokePad = XY[0] * this.lineWidth / 2; + const yStrokePad = XY[1] * this.lineWidth / 2; + box[0] -= xStrokePad; + box[1] -= yStrokePad; + box[2] += xStrokePad; + box[3] += yStrokePad; + } + return box; + } + updateClipFromPath() { + const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox()); + this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]); + } + isEmptyClip() { + return this.minMax[0] === Infinity; + } + startNewPathAndClipBox(box) { + this.clipBox.set(box, 0); + this.minMax.set(MIN_MAX_INIT, 0); + } + getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) { + return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform)); + } +} +function putBinaryImageData(ctx, imgData) { + if (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; + 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; + const white = 0xffffffff; + const black = util_FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff; + 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) { + j = 0; + elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4; + for (i = 0; i < fullChunks; i++) { + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + srcPos += elemsInThisChunk; + ctx.putImageData(chunkImgData, 0, j); + j += FULL_CHUNK_HEIGHT; + } + if (i < totalChunks) { + elemsInThisChunk = width * partialChunkHeight * 4; + dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk)); + ctx.putImageData(chunkImgData, 0, j); + } + } else if (imgData.kind === util_ImageKind.RGB_24BPP) { + 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; + } + 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 + } = convertBlackAndWhiteToRGBA({ + src, + srcPos, + dest, + width, + height: thisChunkHeight, + nonBlackColor: 0 + })); + ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT); + } +} +function copyCtxState(sourceCtx, destCtx) { + const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"]; + 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) { + ctx.strokeStyle = ctx.fillStyle = "#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; + } + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } +} +function getImageSmoothingEnabled(transform, interpolate) { + if (interpolate) { + return true; + } + Util.singularValueDecompose2dScale(transform, XY); + const actualScale = Math.fround(OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS); + return XY[0] <= actualScale && XY[1] <= actualScale; +} +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, filterFactory, { + optionalContentConfig, + markedContentStack = null + }, annotationCanvasMap, pageColors, dependencyTracker) { + 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.filterFactory = filterFactory; + this.groupStack = []; + 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.pageColors = pageColors; + this._cachedScaleForStroking = [-1, 0]; + this._cachedGetSinglePixelWidth = null; + this._cachedBitmapsMap = new Map(); + this.dependencyTracker = dependencyTracker ?? null; + } + getObject(opIdx, data, fallback = null) { + if (typeof data === "string") { + this.dependencyTracker?.recordNamedDependency(opIdx, data); + 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 savedFillStyle = this.ctx.fillStyle; + this.ctx.fillStyle = background || "#ffffff"; + this.ctx.fillRect(0, 0, width, height); + this.ctx.fillStyle = savedFillStyle; + 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(...getCurrentTransform(this.compositeCtx)); + } + this.ctx.save(); + resetCtxToDefault(this.ctx); + 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 = getCurrentTransform(this.ctx); + } + executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper, operationsFilter) { + 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, fnArgs; + while (true) { + if (stepper !== undefined && i === stepper.nextBreakPoint) { + stepper.breakIt(i, continueCallback); + return i; + } + if (!operationsFilter || operationsFilter(i)) { + fnId = fnArray[i]; + fnArgs = argsArray[i] ?? null; + if (fnId !== OPS.dependency) { + if (fnArgs === null) { + this[fnId](i); + } else { + this[fnId](i, ...fnArgs); + } + } else { + for (const depObjId of fnArgs) { + this.dependencyTracker?.recordNamedData(depObjId, 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.current.activeSMask = null; + 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(); + this.#drawFilter(); + } + #drawFilter() { + if (this.pageColors) { + const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background); + if (hcmFilterId !== "none") { + const savedFilter = this.ctx.filter; + this.ctx.filter = hcmFilterId; + this.ctx.drawImage(this.ctx.canvas, 0, 0); + this.ctx.filter = savedFilter; + } + } + } + _scaleImage(img, inverseTransform) { + const width = img.width ?? img.displayWidth; + const height = img.height ?? img.displayHeight; + 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 = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2); + widthScale /= paintWidth / newWidth; + } + if (heightScale > 2 && paintHeight > 1) { + newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : 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(opIdx, img) { + const ctx = this.ctx; + const { + width, + height + } = img; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + const currentTransform = 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]); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); + return { + canvas: cachedImage, + offsetX, + offsetY + }; + } + scaled = cachedImage; + } + if (!scaled) { + maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height); + putBinaryImageMask(maskCanvas.context, img); + } + let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]); + maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]); + const minMax = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax); + const [minX, minY, maxX, maxY] = minMax; + const drawnWidth = Math.round(maxX - minX) || 1; + const drawnHeight = Math.round(maxY - minY) || 1; + const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight); + const fillCtx = fillCanvas.context; + const offsetX = minX; + const offsetY = minY; + fillCtx.translate(-offsetX, -offsetY); + fillCtx.transform(...maskToCanvas); + if (!scaled) { + scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx)); + scaled = scaled.img; + if (cache && isPatternFill) { + cache.set(cacheKey, scaled); + } + } + fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate); + drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height); + fillCtx.globalCompositeOperation = "source-in"; + const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]); + fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx) : fillColor; + fillCtx.fillRect(0, 0, width, height); + if (cache && !isPatternFill) { + this.cachedCanvases.delete("fillCanvas"); + cache.set(cacheKey, fillCanvas.canvas); + } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.transformAndFill); + return { + canvas: fillCanvas.canvas, + offsetX: Math.round(offsetX), + offsetY: Math.round(offsetY) + }; + } + setLineWidth(opIdx, width) { + this.dependencyTracker?.recordSimpleData("lineWidth", opIdx); + if (width !== this.current.lineWidth) { + this._cachedScaleForStroking[0] = -1; + } + this.current.lineWidth = width; + this.ctx.lineWidth = width; + } + setLineCap(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineCap", opIdx); + this.ctx.lineCap = LINE_CAP_STYLES[style]; + } + setLineJoin(opIdx, style) { + this.dependencyTracker?.recordSimpleData("lineJoin", opIdx); + this.ctx.lineJoin = LINE_JOIN_STYLES[style]; + } + setMiterLimit(opIdx, limit) { + this.dependencyTracker?.recordSimpleData("miterLimit", opIdx); + this.ctx.miterLimit = limit; + } + setDash(opIdx, dashArray, dashPhase) { + this.dependencyTracker?.recordSimpleData("dash", opIdx); + const ctx = this.ctx; + if (ctx.setLineDash !== undefined) { + ctx.setLineDash(dashArray); + ctx.lineDashOffset = dashPhase; + } + } + setRenderingIntent(opIdx, intent) {} + setFlatness(opIdx, flatness) {} + setGState(opIdx, states) { + for (const [key, value] of states) { + switch (key) { + case "LW": + this.setLineWidth(opIdx, value); + break; + case "LC": + this.setLineCap(opIdx, value); + break; + case "LJ": + this.setLineJoin(opIdx, value); + break; + case "ML": + this.setMiterLimit(opIdx, value); + break; + case "D": + this.setDash(opIdx, value[0], value[1]); + break; + case "RI": + this.setRenderingIntent(opIdx, value); + break; + case "FL": + this.setFlatness(opIdx, value); + break; + case "Font": + this.setFont(opIdx, value[0], value[1]); + break; + case "CA": + this.dependencyTracker?.recordSimpleData("strokeAlpha", opIdx); + this.current.strokeAlpha = value; + break; + case "ca": + this.dependencyTracker?.recordSimpleData("fillAlpha", opIdx); + this.ctx.globalAlpha = this.current.fillAlpha = value; + break; + case "BM": + this.dependencyTracker?.recordSimpleData("globalCompositeOperation", opIdx); + this.ctx.globalCompositeOperation = value; + break; + case "SMask": + this.dependencyTracker?.recordSimpleData("SMask", opIdx); + this.current.activeSMask = value ? this.tempSMask : null; + this.tempSMask = null; + this.checkSMaskState(); + break; + case "TR": + this.dependencyTracker?.recordSimpleData("filter", opIdx); + this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value); + break; + } + } + } + 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(opIdx) { + 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; + const ctx = this.ctx = scratchCanvas.context; + ctx.setTransform(this.suspendedCtx.getTransform()); + copyCtxState(this.suspendedCtx, ctx); + mirrorContextOperations(ctx, this.suspendedCtx); + this.setGState(opIdx, [["BM", "source-over"]]); + } + 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; + this.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(); + } + 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; + } + this.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(); + } + genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) { + let maskCanvas = maskCtx.canvas; + let maskX = layerOffsetX - maskOffsetX; + let maskY = layerOffsetY - maskOffsetY; + if (backdrop) { + if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) { + const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height); + const ctx = canvas.context; + ctx.drawImage(maskCanvas, -maskX, -maskY); + ctx.globalCompositeOperation = "destination-atop"; + ctx.fillStyle = backdrop; + ctx.fillRect(0, 0, width, height); + ctx.globalCompositeOperation = "source-over"; + maskCanvas = canvas.canvas; + maskX = maskY = 0; + } else { + maskCtx.save(); + maskCtx.globalAlpha = 1; + maskCtx.setTransform(1, 0, 0, 1, 0, 0); + const clip = new Path2D(); + clip.rect(maskX, maskY, width, height); + maskCtx.clip(clip); + maskCtx.globalCompositeOperation = "destination-atop"; + maskCtx.fillStyle = backdrop; + maskCtx.fillRect(maskX, maskY, width, height); + maskCtx.restore(); + } + } + layerCtx.save(); + layerCtx.globalAlpha = 1; + layerCtx.setTransform(1, 0, 0, 1, 0, 0); + if (subtype === "Alpha" && transferMap) { + layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap); + } else if (subtype === "Luminosity") { + layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap); + } + const clip = new Path2D(); + clip.rect(layerOffsetX, layerOffsetY, width, height); + layerCtx.clip(clip); + layerCtx.globalCompositeOperation = "destination-in"; + layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height); + layerCtx.restore(); + } + save(opIdx) { + if (this.inSMaskMode) { + copyCtxState(this.ctx, this.suspendedCtx); + } + this.ctx.save(); + const old = this.current; + this.stateStack.push(old); + this.current = old.clone(); + this.dependencyTracker?.save(opIdx); + } + restore(opIdx) { + this.dependencyTracker?.restore(opIdx); + if (this.stateStack.length === 0) { + if (this.inSMaskMode) { + this.endSMaskMode(); + } + return; + } + this.current = this.stateStack.pop(); + this.ctx.restore(); + if (this.inSMaskMode) { + copyCtxState(this.suspendedCtx, this.ctx); + } + this.checkSMaskState(); + this.pendingClip = null; + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + transform(opIdx, a, b, c, d, e, f) { + this.dependencyTracker?.recordIncrementalData("transform", opIdx); + this.ctx.transform(a, b, c, d, e, f); + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + } + constructPath(opIdx, op, data, minMax) { + let [path] = data; + if (!minMax) { + path ||= data[0] = new Path2D(); + this[op](opIdx, path); + return; + } + if (this.dependencyTracker !== null) { + const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0; + this.dependencyTracker.resetBBox(opIdx).recordBBox(opIdx, this.ctx, minMax[0] - outerExtraSize, minMax[2] + outerExtraSize, minMax[1] - outerExtraSize, minMax[3] + outerExtraSize).recordDependencies(opIdx, ["transform"]); + } + if (!(path instanceof Path2D)) { + const path2d = data[0] = new Path2D(); + for (let i = 0, ii = path.length; i < ii;) { + switch (path[i++]) { + case DrawOPS.moveTo: + path2d.moveTo(path[i++], path[i++]); + break; + case DrawOPS.lineTo: + path2d.lineTo(path[i++], path[i++]); + break; + case DrawOPS.curveTo: + path2d.bezierCurveTo(path[i++], path[i++], path[i++], path[i++], path[i++], path[i++]); + break; + case DrawOPS.closePath: + path2d.closePath(); + break; + default: + warn(`Unrecognized drawing path operator: ${path[i - 1]}`); + break; + } + } + path = path2d; + } + Util.axialAlignedBoundingBox(minMax, getCurrentTransform(this.ctx), this.current.minMax); + this[op](opIdx, path); + this._pathStartIdx = opIdx; + } + closePath(opIdx) { + this.ctx.closePath(); + } + stroke(opIdx, path, 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) { + const baseTransform = strokeColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + ctx.save(); + ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + this.rescaleAndStroke(path, false); + ctx.restore(); + } else { + this.rescaleAndStroke(path, true); + } + } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke); + if (consumePath) { + this.consumePath(opIdx, path, this.current.getClippedPathBoundingBox(PathType.STROKE, getCurrentTransform(this.ctx))); + } + ctx.globalAlpha = this.current.fillAlpha; + } + closeStroke(opIdx, path) { + this.stroke(opIdx, path); + } + fill(opIdx, path, consumePath = true) { + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + let needRestore = false; + if (isPatternFill) { + const baseTransform = fillColor.isModifyingCurrentTransform() ? ctx.getTransform() : null; + this.dependencyTracker?.save(opIdx); + ctx.save(); + ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + if (baseTransform) { + const newPath = new Path2D(); + newPath.addPath(path, ctx.getTransform().invertSelf().multiplySelf(baseTransform)); + path = newPath; + } + needRestore = true; + } + const intersect = this.current.getClippedPathBoundingBox(); + if (this.contentVisible && intersect !== null) { + if (this.pendingEOFill) { + ctx.fill(path, "evenodd"); + this.pendingEOFill = false; + } else { + ctx.fill(path); + } + } + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill); + if (needRestore) { + ctx.restore(); + this.dependencyTracker?.restore(opIdx); + } + if (consumePath) { + this.consumePath(opIdx, path, intersect); + } + } + eoFill(opIdx, path) { + this.pendingEOFill = true; + this.fill(opIdx, path); + } + fillStroke(opIdx, path) { + this.fill(opIdx, path, false); + this.stroke(opIdx, path, false); + this.consumePath(opIdx, path); + } + eoFillStroke(opIdx, path) { + this.pendingEOFill = true; + this.fillStroke(opIdx, path); + } + closeFillStroke(opIdx, path) { + this.fillStroke(opIdx, path); + } + closeEOFillStroke(opIdx, path) { + this.pendingEOFill = true; + this.fillStroke(opIdx, path); + } + endPath(opIdx, path) { + this.consumePath(opIdx, path); + } + rawFillPath(opIdx, path) { + this.ctx.fill(path); + this.dependencyTracker?.recordDependencies(opIdx, Dependencies.rawFillPath).recordOperation(opIdx); + } + clip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); + this.pendingClip = NORMAL_CLIP; + } + eoClip(opIdx) { + this.dependencyTracker?.recordFutureForcedDependency("clipMode", opIdx); + this.pendingClip = EO_CLIP; + } + beginText(opIdx) { + this.current.textMatrix = null; + this.current.textMatrixScale = 1; + this.current.x = this.current.lineX = 0; + this.current.y = this.current.lineY = 0; + this.dependencyTracker?.recordOpenMarker(opIdx).resetIncrementalData("sameLineText").resetIncrementalData("moveText", opIdx); + } + endText(opIdx) { + const paths = this.pendingTextPaths; + const ctx = this.ctx; + if (this.dependencyTracker) { + const { + dependencyTracker + } = this; + if (paths !== undefined) { + dependencyTracker.recordFutureForcedDependency("textClip", dependencyTracker.getOpenMarker()).recordFutureForcedDependency("textClip", opIdx); + } + dependencyTracker.recordCloseMarker(opIdx); + } + if (paths !== undefined) { + const newPath = new Path2D(); + const invTransf = ctx.getTransform().invertSelf(); + for (const { + transform, + x, + y, + fontSize, + path + } of paths) { + if (!path) { + continue; + } + newPath.addPath(path, new DOMMatrix(transform).preMultiplySelf(invTransf).translate(x, y).scale(fontSize, -fontSize)); + } + ctx.clip(newPath); + } + delete this.pendingTextPaths; + } + setCharSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("charSpacing", opIdx); + this.current.charSpacing = spacing; + } + setWordSpacing(opIdx, spacing) { + this.dependencyTracker?.recordSimpleData("wordSpacing", opIdx); + this.current.wordSpacing = spacing; + } + setHScale(opIdx, scale) { + this.dependencyTracker?.recordSimpleData("hScale", opIdx); + this.current.textHScale = scale / 100; + } + setLeading(opIdx, leading) { + this.dependencyTracker?.recordSimpleData("leading", opIdx); + this.current.leading = -leading; + } + setFont(opIdx, fontRefName, size) { + this.dependencyTracker?.recordSimpleData("font", opIdx).recordSimpleDataFromNamed("fontObj", fontRefName, opIdx); + 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 || FONT_IDENTITY_MATRIX; + if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) { + 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"; + const typeface = fontObj.systemFontInfo?.css || `"${name}", ${fontObj.fallbackName}`; + let bold = "normal"; + if (fontObj.black) { + bold = "900"; + } else if (fontObj.bold) { + bold = "bold"; + } + const italic = fontObj.italic ? "italic" : "normal"; + 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(opIdx, mode) { + this.dependencyTracker?.recordSimpleData("textRenderingMode", opIdx); + this.current.textRenderingMode = mode; + } + setTextRise(opIdx, rise) { + this.dependencyTracker?.recordSimpleData("textRise", opIdx); + this.current.textRise = rise; + } + moveText(opIdx, x, y) { + this.dependencyTracker?.resetIncrementalData("sameLineText").recordIncrementalData("moveText", opIdx); + this.current.x = this.current.lineX += x; + this.current.y = this.current.lineY += y; + } + setLeadingMoveText(opIdx, x, y) { + this.setLeading(opIdx, -y); + this.moveText(opIdx, x, y); + } + setTextMatrix(opIdx, matrix) { + this.dependencyTracker?.recordSimpleData("textMatrix", opIdx); + const { + current + } = this; + current.textMatrix = matrix; + current.textMatrixScale = Math.hypot(matrix[0], matrix[1]); + current.x = current.lineX = 0; + current.y = current.lineY = 0; + } + nextLine(opIdx) { + this.moveText(opIdx, 0, this.current.leading); + this.dependencyTracker?.recordIncrementalData("moveText", this.dependencyTracker.getSimpleIndex("leading") ?? opIdx); + } + #getScaledPath(path, currentTransform, transform) { + const newPath = new Path2D(); + newPath.addPath(path, new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)); + return newPath; + } + paintChar(opIdx, character, x, y, patternFillTransform, patternStrokeTransform) { + 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 & TextRenderingMode.FILL_STROKE_MASK; + const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG); + const patternFill = current.patternFill && !font.missingFile; + const patternStroke = current.patternStroke && !font.missingFile; + let path; + if ((font.disableFontFace || isAddToPathSet || patternFill || patternStroke) && !font.missingFile) { + path = font.getPathGenerator(this.commonObjs, character); + } + if (path && (font.disableFontFace || patternFill || patternStroke)) { + ctx.save(); + ctx.translate(x, y); + ctx.scale(fontSize, -fontSize); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font); + let currentTransform; + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternFillTransform) { + currentTransform = ctx.getTransform(); + ctx.setTransform(...patternFillTransform); + const scaledPath = this.#getScaledPath(path, currentTransform, patternFillTransform); + ctx.fill(scaledPath); + } else { + ctx.fill(path); + } + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (patternStrokeTransform) { + currentTransform ||= ctx.getTransform(); + ctx.setTransform(...patternStrokeTransform); + const { + a, + b, + c, + d + } = currentTransform; + const invPatternTransform = Util.inverseTransform(patternStrokeTransform); + const transf = Util.transform([a, b, c, d, 0, 0], invPatternTransform); + Util.singularValueDecompose2dScale(transf, XY); + ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize; + ctx.stroke(this.#getScaledPath(path, currentTransform, patternStrokeTransform)); + } else { + ctx.lineWidth /= fontSize; + ctx.stroke(path); + } + } + ctx.restore(); + } else { + if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + ctx.fillText(character, x, y); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)); + } + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) { + if (this.dependencyTracker) { + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () => ctx.measureText(character)).recordDependencies(opIdx, Dependencies.stroke); + } + ctx.strokeText(character, x, y); + } + } + if (isAddToPathSet) { + const paths = this.pendingTextPaths ||= []; + paths.push({ + transform: getCurrentTransform(ctx), + x, + y, + fontSize, + path + }); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y); + } + } + 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 shadow(this, "isFontSubpixelAAEnabled", enabled); + } + showText(opIdx, glyphs) { + if (this.dependencyTracker) { + this.dependencyTracker.recordDependencies(opIdx, Dependencies.showText).resetBBox(opIdx); + if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) { + this.dependencyTracker.recordFutureForcedDependency("textClip", opIdx).inheritPendingDependenciesAsFutureForcedDependencies(); + } + } + const current = this.current; + const font = current.font; + if (font.isType3Font) { + this.showType3Text(opIdx, glyphs); + this.dependencyTracker?.recordShowTextOperation(opIdx); + return undefined; + } + const fontSize = current.fontSize; + if (fontSize === 0) { + this.dependencyTracker?.recordOperation(opIdx); + 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 === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill; + ctx.save(); + if (current.textMatrix) { + 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 patternFillTransform, patternStrokeTransform; + if (current.patternFill) { + ctx.save(); + const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx); + patternFillTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.fillStyle = pattern; + } + if (current.patternStroke) { + ctx.save(); + const pattern = current.strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE, opIdx); + patternStrokeTransform = getCurrentTransform(ctx); + ctx.restore(); + ctx.strokeStyle = pattern; + } + let lineWidth = current.lineWidth; + const scale = current.textMatrixScale; + if (scale === 0 || lineWidth === 0) { + const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK; + if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === 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; + } + const joinedChars = chars.join(""); + ctx.fillText(joinedChars, 0, 0); + if (this.dependencyTracker !== null) { + const measure = ctx.measureText(joinedChars); + this.dependencyTracker.recordBBox(opIdx, this.ctx, -measure.actualBoundingBoxLeft, measure.actualBoundingBoxRight, -measure.actualBoundingBoxAscent, measure.actualBoundingBoxDescent).recordShowTextOperation(opIdx); + } + 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; + } + let measure; + if (font.remeasure && width > 0) { + measure = ctx.measureText(character); + const measuredWidth = measure.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); + this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, measure ? { + bbox: null + } : font, fontSize / fontSizeScale, scaledX, scaledY, () => measure ?? ctx.measureText(character)); + } else { + this.paintChar(opIdx, character, scaledX, scaledY, patternFillTransform, patternStrokeTransform); + if (accent) { + const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale; + const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale; + this.paintChar(opIdx, accent.fontChar, scaledAccentX, scaledAccentY, patternFillTransform, patternStrokeTransform); + } + } + } + const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection; + x += charWidth; + if (restoreNeeded) { + ctx.restore(); + } + } + if (vertical) { + current.y -= x; + } else { + current.x += x * textHScale; + } + ctx.restore(); + this.compose(); + this.dependencyTracker?.recordShowTextOperation(opIdx); + return undefined; + } + showType3Text(opIdx, 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 || FONT_IDENTITY_MATRIX; + const glyphsLength = glyphs.length; + const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE; + let i, glyph, width, spacingLength; + if (isTextInvisible || fontSize === 0) { + return; + } + this._cachedScaleForStroking[0] = -1; + this._cachedGetSinglePixelWidth = null; + ctx.save(); + if (current.textMatrix) { + ctx.transform(...current.textMatrix); + } + ctx.translate(current.x, current.y + current.textRise); + ctx.scale(textHScale, fontDirection); + const dependencyTracker = this.dependencyTracker; + this.dependencyTracker = dependencyTracker ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx) : null; + 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) { + warn(`Type3 character "${glyph.operatorListId}" is not available.`); + } else if (this.contentVisible) { + this.save(); + ctx.scale(fontSize, fontSize); + ctx.transform(...fontMatrix); + this.executeOperatorList(operatorList); + this.restore(); + } + const p = [glyph.width, 0]; + Util.applyTransform(p, fontMatrix); + width = p[0] * fontSize + spacing; + ctx.translate(width, 0); + current.x += width * textHScale; + } + ctx.restore(); + if (dependencyTracker) { + this.dependencyTracker = dependencyTracker; + } + } + setCharWidth(opIdx, xWidth, yWidth) {} + setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) { + const clip = new Path2D(); + clip.rect(llx, lly, urx - llx, ury - lly); + this.ctx.clip(clip); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury).recordClipBox(opIdx, this.ctx, llx, urx, lly, ury); + this.endPath(opIdx); + } + getColorN_Pattern(opIdx, IR) { + let pattern; + if (IR[0] === "TilingPattern") { + const baseTransform = this.baseTransform || getCurrentTransform(this.ctx); + const canvasGraphicsFactory = { + createCanvasGraphics: (ctx, renderingOpIdx) => new CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig: this.optionalContentConfig, + markedContentStack: this.markedContentStack + }, undefined, undefined, this.dependencyTracker ? new CanvasNestedDependencyTracker(this.dependencyTracker, renderingOpIdx, true) : null) + }; + pattern = new TilingPattern(IR, this.ctx, canvasGraphicsFactory, baseTransform); + } else { + pattern = this._getPattern(opIdx, IR[1], IR[2]); + } + return pattern; + } + setStrokeColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.current.strokeColor = this.getColorN_Pattern(opIdx, args); + this.current.patternStroke = true; + } + setFillColorN(opIdx, ...args) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.current.fillColor = this.getColorN_Pattern(opIdx, args); + this.current.patternFill = true; + } + setStrokeRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.ctx.strokeStyle = this.current.strokeColor = color; + this.current.patternStroke = false; + } + setStrokeTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("strokeColor", opIdx); + this.ctx.strokeStyle = this.current.strokeColor = "transparent"; + this.current.patternStroke = false; + } + setFillRGBColor(opIdx, color) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.ctx.fillStyle = this.current.fillColor = color; + this.current.patternFill = false; + } + setFillTransparent(opIdx) { + this.dependencyTracker?.recordSimpleData("fillColor", opIdx); + this.ctx.fillStyle = this.current.fillColor = "transparent"; + this.current.patternFill = false; + } + _getPattern(opIdx, objId, matrix = null) { + let pattern; + if (this.cachedPatterns.has(objId)) { + pattern = this.cachedPatterns.get(objId); + } else { + pattern = getShadingPattern(this.getObject(opIdx, objId)); + this.cachedPatterns.set(objId, pattern); + } + if (matrix) { + pattern.matrix = matrix; + } + return pattern; + } + shadingFill(opIdx, objId) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + this.save(opIdx); + const pattern = this._getPattern(opIdx, objId); + ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING, opIdx); + const inv = getCurrentTransformInverse(ctx); + if (inv) { + const { + width, + height + } = ctx.canvas; + const minMax = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax); + const [x0, y0, x1, y1] = minMax; + this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); + } else { + this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); + } + this.dependencyTracker?.resetBBox(opIdx).recordFullPageBBox(opIdx).recordDependencies(opIdx, Dependencies.transform).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); + this.compose(this.current.getClippedPathBoundingBox()); + this.restore(opIdx); + } + beginInlineImage() { + unreachable("Should not call beginInlineImage"); + } + beginImageData() { + unreachable("Should not call beginImageData"); + } + paintFormXObjectBegin(opIdx, matrix, bbox) { + if (!this.contentVisible) { + return; + } + this.save(opIdx); + this.baseTransformStack.push(this.baseTransform); + if (matrix) { + this.transform(opIdx, ...matrix); + } + this.baseTransform = getCurrentTransform(this.ctx); + if (bbox) { + Util.axialAlignedBoundingBox(bbox, this.baseTransform, this.current.minMax); + const [x0, y0, x1, y1] = bbox; + const clip = new Path2D(); + clip.rect(x0, y0, x1 - x0, y1 - y0); + this.ctx.clip(clip); + this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1); + this.endPath(opIdx); + } + } + paintFormXObjectEnd(opIdx) { + if (!this.contentVisible) { + return; + } + this.restore(opIdx); + this.baseTransform = this.baseTransformStack.pop(); + } + beginGroup(opIdx, group) { + if (!this.contentVisible) { + return; + } + this.save(opIdx); + if (this.inSMaskMode) { + this.endSMaskMode(); + this.current.activeSMask = null; + } + const currentCtx = this.ctx; + if (!group.isolated) { + info("TODO: Support non-isolated groups."); + } + if (group.knockout) { + warn("Knockout groups not supported."); + } + const currentTransform = getCurrentTransform(currentCtx); + if (group.matrix) { + currentCtx.transform(...group.matrix); + } + if (!group.bbox) { + throw new Error("Bounding box is required."); + } + let bounds = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx), bounds); + const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height]; + bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0]; + const offsetX = Math.floor(bounds[0]); + const offsetY = Math.floor(bounds[1]); + const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1); + const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1); + 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.translate(-offsetX, -offsetY); + groupCtx.transform(...currentTransform); + let clip = new Path2D(); + const [x0, y0, x1, y1] = group.bbox; + clip.rect(x0, y0, x1 - x0, y1 - y0); + if (group.matrix) { + const path = new Path2D(); + path.addPath(clip, new DOMMatrix(group.matrix)); + clip = path; + } + groupCtx.clip(clip); + if (group.smask) { + this.smaskStack.push({ + canvas: scratchCanvas.canvas, + context: groupCtx, + offsetX, + offsetY, + subtype: group.smask.subtype, + backdrop: group.smask.backdrop, + transferMap: group.smask.transferMap || null, + startTransformInverse: null + }); + } + if (!group.smask || this.dependencyTracker) { + currentCtx.setTransform(1, 0, 0, 1, 0, 0); + currentCtx.translate(offsetX, offsetY); + currentCtx.save(); + } + copyCtxState(currentCtx, groupCtx); + this.ctx = groupCtx; + this.dependencyTracker?.inheritSimpleDataAsFutureForcedDependencies(["fillAlpha", "strokeAlpha", "globalCompositeOperation"]).pushBaseTransform(currentCtx); + this.setGState(opIdx, [["BM", "source-over"], ["ca", 1], ["CA", 1]]); + this.groupStack.push(currentCtx); + this.groupLevel++; + } + endGroup(opIdx, group) { + if (!this.contentVisible) { + return; + } + this.groupLevel--; + const groupCtx = this.ctx; + const ctx = this.groupStack.pop(); + this.ctx = ctx; + this.ctx.imageSmoothingEnabled = false; + this.dependencyTracker?.popBaseTransform(); + if (group.smask) { + this.tempSMask = this.smaskStack.pop(); + this.restore(opIdx); + if (this.dependencyTracker) { + this.ctx.restore(); + } + } else { + this.ctx.restore(); + const currentMtx = getCurrentTransform(this.ctx); + this.restore(opIdx); + this.ctx.save(); + this.ctx.setTransform(...currentMtx); + const dirtyBox = MIN_MAX_INIT.slice(); + Util.axialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx, dirtyBox); + this.ctx.drawImage(groupCtx.canvas, 0, 0); + this.ctx.restore(); + this.compose(dirtyBox); + } + } + beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas) { + this.#restoreInitialState(); + resetCtxToDefault(this.ctx); + this.ctx.save(); + this.save(opIdx); + if (this.baseTransform) { + this.ctx.setTransform(...this.baseTransform); + } + if (rect) { + 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; + Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY); + 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.save(); + this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]); + resetCtxToDefault(this.ctx); + } else { + resetCtxToDefault(this.ctx); + this.endPath(opIdx); + const clip = new Path2D(); + clip.rect(rect[0], rect[1], width, height); + this.ctx.clip(clip); + } + } + this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height); + this.transform(opIdx, ...transform); + this.transform(opIdx, ...matrix); + } + endAnnotation(opIdx) { + if (this.annotationCanvas) { + this.ctx.restore(); + this.#drawFilter(); + this.ctx = this.annotationCanvas.savedCtx; + delete this.annotationCanvas.savedCtx; + delete this.annotationCanvas; + } + } + paintImageMaskXObject(opIdx, img) { + if (!this.contentVisible) { + return; + } + const count = img.count; + img = this.getObject(opIdx, img.data, img); + img.count = count; + const ctx = this.ctx; + const mask = this._createMaskCanvas(opIdx, img); + const maskCanvas = mask.canvas; + ctx.save(); + ctx.setTransform(1, 0, 0, 1, 0, 0); + ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, mask.offsetX, mask.offsetX + maskCanvas.width, mask.offsetY, mask.offsetY + maskCanvas.height).recordOperation(opIdx); + ctx.restore(); + this.compose(); + } + paintImageMaskXObjectRepeat(opIdx, img, scaleX, skewX = 0, skewY = 0, scaleY, positions) { + if (!this.contentVisible) { + return; + } + img = this.getObject(opIdx, img.data, img); + const ctx = this.ctx; + ctx.save(); + const currentTransform = getCurrentTransform(ctx); + ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0); + const mask = this._createMaskCanvas(opIdx, img); + ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]); + this.dependencyTracker?.resetBBox(opIdx); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]); + ctx.drawImage(mask.canvas, trans[4], trans[5]); + this.dependencyTracker?.recordBBox(opIdx, this.ctx, trans[4], trans[4] + mask.canvas.width, trans[5], trans[5] + mask.canvas.height); + } + ctx.restore(); + this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + } + paintImageMaskXObjectGroup(opIdx, images) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + const fillColor = this.current.fillColor; + const isPatternFill = this.current.patternFill; + this.dependencyTracker?.resetBBox(opIdx).recordDependencies(opIdx, Dependencies.transformAndFill); + 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(opIdx, data, image); + putBinaryImageMask(maskCtx, img); + maskCtx.globalCompositeOperation = "source-in"; + maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL, opIdx) : 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); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height); + ctx.restore(); + } + this.compose(); + this.dependencyTracker?.recordOperation(opIdx); + } + paintImageXObject(opIdx, objId) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(opIdx, objId); + if (!imgData) { + warn("Dependent image isn't ready yet"); + return; + } + this.paintInlineImageXObject(opIdx, imgData); + } + paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) { + if (!this.contentVisible) { + return; + } + const imgData = this.getObject(opIdx, objId); + if (!imgData) { + 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(opIdx, imgData, map); + } + applyTransferMapsToCanvas(ctx) { + if (this.current.transferMaps !== "none") { + ctx.filter = this.current.transferMaps; + ctx.drawImage(ctx.canvas, 0, 0); + ctx.filter = "none"; + } + return ctx.canvas; + } + applyTransferMapsToBitmap(imgData) { + if (this.current.transferMaps === "none") { + return imgData.bitmap; + } + const { + bitmap, + width, + height + } = imgData; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height); + const tmpCtx = tmpCanvas.context; + tmpCtx.filter = this.current.transferMaps; + tmpCtx.drawImage(bitmap, 0, 0); + tmpCtx.filter = "none"; + return tmpCanvas.canvas; + } + paintInlineImageXObject(opIdx, imgData) { + if (!this.contentVisible) { + return; + } + const width = imgData.width; + const height = imgData.height; + const ctx = this.ctx; + this.save(opIdx); + const { + filter + } = ctx; + if (filter !== "none" && filter !== "") { + ctx.filter = "none"; + } + ctx.scale(1 / width, -1 / height); + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = this.applyTransferMapsToBitmap(imgData); + } else 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); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx)); + ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate); + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, ctx, 0, width, -height, 0).recordDependencies(opIdx, Dependencies.imageXObject).recordOperation(opIdx); + drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height); + this.compose(); + this.restore(opIdx); + } + paintInlineImageXObjectGroup(opIdx, imgData, map) { + if (!this.contentVisible) { + return; + } + const ctx = this.ctx; + let imgToPaint; + if (imgData.bitmap) { + imgToPaint = imgData.bitmap; + } else { + const w = imgData.width; + const h = imgData.height; + const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h); + const tmpCtx = tmpCanvas.context; + putBinaryImageData(tmpCtx, imgData); + imgToPaint = this.applyTransferMapsToCanvas(tmpCtx); + } + this.dependencyTracker?.resetBBox(opIdx); + for (const entry of map) { + ctx.save(); + ctx.transform(...entry.transform); + ctx.scale(1, -1); + drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1); + this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0); + ctx.restore(); + } + this.dependencyTracker?.recordOperation(opIdx); + this.compose(); + } + paintSolidColorImageMask(opIdx) { + if (!this.contentVisible) { + return; + } + this.dependencyTracker?.resetBBox(opIdx).recordBBox(opIdx, this.ctx, 0, 1, 0, 1).recordDependencies(opIdx, Dependencies.fill).recordOperation(opIdx); + this.ctx.fillRect(0, 0, 1, 1); + this.compose(); + } + markPoint(opIdx, tag) {} + markPointProps(opIdx, tag, properties) {} + beginMarkedContent(opIdx, tag) { + this.dependencyTracker?.beginMarkedContent(opIdx); + this.markedContentStack.push({ + visible: true + }); + } + beginMarkedContentProps(opIdx, tag, properties) { + this.dependencyTracker?.beginMarkedContent(opIdx); + if (tag === "OC") { + this.markedContentStack.push({ + visible: this.optionalContentConfig.isVisible(properties) + }); + } else { + this.markedContentStack.push({ + visible: true + }); + } + this.contentVisible = this.isContentVisible(); + } + endMarkedContent(opIdx) { + this.dependencyTracker?.endMarkedContent(opIdx); + this.markedContentStack.pop(); + this.contentVisible = this.isContentVisible(); + } + beginCompat(opIdx) {} + endCompat(opIdx) {} + consumePath(opIdx, path, 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(path, "evenodd"); + } else { + ctx.clip(path); + } + } + this.pendingClip = null; + this.dependencyTracker?.bboxToClipBoxDropOperation(opIdx).recordFutureForcedDependency("clipPath", opIdx); + } else { + this.dependencyTracker?.recordOperation(opIdx); + } + this.current.startNewPathAndClipBox(this.current.clipBox); + } + getSinglePixelWidth() { + if (!this._cachedGetSinglePixelWidth) { + const m = 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[0] === -1) { + const { + lineWidth + } = this.current; + const { + a, + b, + c, + d + } = this.ctx.getTransform(); + let scaleX, scaleY; + if (b === 0 && c === 0) { + const normX = Math.abs(a); + const normY = Math.abs(d); + if (normX === normY) { + if (lineWidth === 0) { + scaleX = scaleY = 1 / normX; + } else { + const scaledLineWidth = normX * lineWidth; + scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1; + } + } else 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(a * d - b * c); + const normX = Math.hypot(a, b); + const normY = Math.hypot(c, d); + 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[0] = scaleX; + this._cachedScaleForStroking[1] = scaleY; + } + return this._cachedScaleForStroking; + } + rescaleAndStroke(path, saveRestore) { + const { + ctx, + current: { + lineWidth + } + } = this; + const [scaleX, scaleY] = this.getScaleForStroking(); + if (scaleX === scaleY) { + ctx.lineWidth = (lineWidth || 1) * scaleX; + ctx.stroke(path); + return; + } + const dashes = ctx.getLineDash(); + if (saveRestore) { + ctx.save(); + } + ctx.scale(scaleX, scaleY); + SCALE_MATRIX.a = 1 / scaleX; + SCALE_MATRIX.d = 1 / scaleY; + const newPath = new Path2D(); + newPath.addPath(path, SCALE_MATRIX); + if (dashes.length > 0) { + const scale = Math.max(scaleX, scaleY); + ctx.setLineDash(dashes.map(x => x / scale)); + ctx.lineDashOffset /= scale; + } + ctx.lineWidth = lineWidth || 1; + ctx.stroke(newPath); + if (saveRestore) { + ctx.restore(); + } + } + isContentVisible() { + for (let i = this.markedContentStack.length - 1; i >= 0; i--) { + if (!this.markedContentStack[i].visible) { + return false; + } + } + return true; + } +} +for (const op in OPS) { + if (CanvasGraphics.prototype[op] !== undefined) { + CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op]; + } +} + +;// ./src/shared/obj-bin-transform.js + +class CssFontInfo { + #buffer; + #view; + #decoder; + static strings = ["fontFamily", "fontWeight", "italicAngle"]; + static write(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of CssFontInfo.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + const buffer = new ArrayBuffer(stringsLength); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + for (const prop of CssFontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + assert(offset === buffer.byteLength, "CssFontInfo.write: Buffer overflow"); + return buffer; + } + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(this.#buffer); + this.#decoder = new TextDecoder(); + } + #readString(index) { + assert(index < CssFontInfo.strings.length, "Invalid string index"); + let offset = 0; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length)); + } + get fontFamily() { + return this.#readString(0); + } + get fontWeight() { + return this.#readString(1); + } + get italicAngle() { + return this.#readString(2); + } +} +class SystemFontInfo { + #buffer; + #view; + #decoder; + static strings = ["css", "loadedName", "baseFontName", "src"]; + static write(info) { + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of SystemFontInfo.strings) { + const encoded = encoder.encode(info[prop]); + encodedStrings[prop] = encoded; + stringsLength += 4 + encoded.length; + } + stringsLength += 4; + let encodedStyleStyle, + encodedStyleWeight, + lengthEstimate = 1 + stringsLength; + if (info.style) { + encodedStyleStyle = encoder.encode(info.style.style); + encodedStyleWeight = encoder.encode(info.style.weight); + lengthEstimate += 4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length; + } + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + view.setUint8(offset++, info.guessFallback ? 1 : 0); + view.setUint32(offset, 0); + offset += 4; + stringsLength = 0; + for (const prop of SystemFontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + stringsLength += 4 + length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32(offset - stringsLength - 4, stringsLength); + if (info.style) { + view.setUint32(offset, encodedStyleStyle.length); + data.set(encodedStyleStyle, offset + 4); + offset += 4 + encodedStyleStyle.length; + view.setUint32(offset, encodedStyleWeight.length); + data.set(encodedStyleWeight, offset + 4); + offset += 4 + encodedStyleWeight.length; + } + assert(offset <= buffer.byteLength, "SubstitionInfo.write: Buffer overflow"); + return buffer.transferToFixedLength(offset); + } + constructor(buffer) { + this.#buffer = buffer; + this.#view = new DataView(this.#buffer); + this.#decoder = new TextDecoder(); + } + get guessFallback() { + return this.#view.getUint8(0) !== 0; + } + #readString(index) { + assert(index < SystemFontInfo.strings.length, "Invalid string index"); + let offset = 5; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + return this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, length)); + } + get css() { + return this.#readString(0); + } + get loadedName() { + return this.#readString(1); + } + get baseFontName() { + return this.#readString(2); + } + get src() { + return this.#readString(3); + } + get style() { + let offset = 1; + offset += 4 + this.#view.getUint32(offset); + const styleLength = this.#view.getUint32(offset); + const style = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, styleLength)); + offset += 4 + styleLength; + const weightLength = this.#view.getUint32(offset); + const weight = this.#decoder.decode(new Uint8Array(this.#buffer, offset + 4, weightLength)); + return { + style, + weight + }; + } +} +class FontInfo { + static bools = ["black", "bold", "disableFontFace", "fontExtraProperties", "isInvalidPDFjsFont", "isType3Font", "italic", "missingFile", "remeasure", "vertical"]; + static numbers = ["ascent", "defaultWidth", "descent"]; + static strings = ["fallbackName", "loadedName", "mimetype", "name"]; + static #OFFSET_NUMBERS = Math.ceil(this.bools.length * 2 / 8); + static #OFFSET_BBOX = this.#OFFSET_NUMBERS + this.numbers.length * 8; + static #OFFSET_FONT_MATRIX = this.#OFFSET_BBOX + 1 + 2 * 4; + static #OFFSET_DEFAULT_VMETRICS = this.#OFFSET_FONT_MATRIX + 1 + 8 * 6; + static #OFFSET_STRINGS = this.#OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3; + #buffer; + #decoder; + #view; + constructor({ + data, + extra + }) { + this.#buffer = data; + this.#decoder = new TextDecoder(); + this.#view = new DataView(this.#buffer); + if (extra) { + Object.assign(this, extra); + } + } + #readBoolean(index) { + assert(index < FontInfo.bools.length, "Invalid boolean index"); + const byteOffset = Math.floor(index / 4); + const bitOffset = index * 2 % 8; + const value = this.#view.getUint8(byteOffset) >> bitOffset & 0x03; + return value === 0x00 ? undefined : value === 0x02; + } + get black() { + return this.#readBoolean(0); + } + get bold() { + return this.#readBoolean(1); + } + get disableFontFace() { + return this.#readBoolean(2); + } + get fontExtraProperties() { + return this.#readBoolean(3); + } + get isInvalidPDFjsFont() { + return this.#readBoolean(4); + } + get isType3Font() { + return this.#readBoolean(5); + } + get italic() { + return this.#readBoolean(6); + } + get missingFile() { + return this.#readBoolean(7); + } + get remeasure() { + return this.#readBoolean(8); + } + get vertical() { + return this.#readBoolean(9); + } + #readNumber(index) { + assert(index < FontInfo.numbers.length, "Invalid number index"); + return this.#view.getFloat64(FontInfo.#OFFSET_NUMBERS + index * 8); + } + get ascent() { + return this.#readNumber(0); + } + get defaultWidth() { + return this.#readNumber(1); + } + get descent() { + return this.#readNumber(2); + } + get bbox() { + let offset = FontInfo.#OFFSET_BBOX; + const numCoords = this.#view.getUint8(offset); + if (numCoords === 0) { + return undefined; + } + offset += 1; + const bbox = []; + for (let i = 0; i < 4; i++) { + bbox.push(this.#view.getInt16(offset, true)); + offset += 2; + } + return bbox; + } + get fontMatrix() { + let offset = FontInfo.#OFFSET_FONT_MATRIX; + const numPoints = this.#view.getUint8(offset); + if (numPoints === 0) { + return undefined; + } + offset += 1; + const fontMatrix = []; + for (let i = 0; i < 6; i++) { + fontMatrix.push(this.#view.getFloat64(offset, true)); + offset += 8; + } + return fontMatrix; + } + get defaultVMetrics() { + let offset = FontInfo.#OFFSET_DEFAULT_VMETRICS; + const numMetrics = this.#view.getUint8(offset); + if (numMetrics === 0) { + return undefined; + } + offset += 1; + const defaultVMetrics = []; + for (let i = 0; i < 3; i++) { + defaultVMetrics.push(this.#view.getInt16(offset, true)); + offset += 2; + } + return defaultVMetrics; + } + #readString(index) { + assert(index < FontInfo.strings.length, "Invalid string index"); + let offset = FontInfo.#OFFSET_STRINGS + 4; + for (let i = 0; i < index; i++) { + offset += this.#view.getUint32(offset) + 4; + } + const length = this.#view.getUint32(offset); + const stringData = new Uint8Array(length); + stringData.set(new Uint8Array(this.#buffer, offset + 4, length)); + return this.#decoder.decode(stringData); + } + get fallbackName() { + return this.#readString(0); + } + get loadedName() { + return this.#readString(1); + } + get mimetype() { + return this.#readString(2); + } + get name() { + return this.#readString(3); + } + get data() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + offset += 4 + cssFontInfoLength; + const length = this.#view.getUint32(offset); + if (length === 0) { + return undefined; + } + return new Uint8Array(this.#buffer, offset + 4, length); + } + clearData() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + offset += 4 + cssFontInfoLength; + const length = this.#view.getUint32(offset); + const data = new Uint8Array(this.#buffer, offset + 4, length); + data.fill(0); + this.#view.setUint32(offset, 0); + } + get cssFontInfo() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + offset += 4 + systemFontInfoLength; + const cssFontInfoLength = this.#view.getUint32(offset); + if (cssFontInfoLength === 0) { + return null; + } + const cssFontInfoData = new Uint8Array(cssFontInfoLength); + cssFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength)); + return new CssFontInfo(cssFontInfoData.buffer); + } + get systemFontInfo() { + let offset = FontInfo.#OFFSET_STRINGS; + const stringsLength = this.#view.getUint32(offset); + offset += 4 + stringsLength; + const systemFontInfoLength = this.#view.getUint32(offset); + if (systemFontInfoLength === 0) { + return null; + } + const systemFontInfoData = new Uint8Array(systemFontInfoLength); + systemFontInfoData.set(new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength)); + return new SystemFontInfo(systemFontInfoData.buffer); + } + static write(font) { + const systemFontInfoBuffer = font.systemFontInfo ? SystemFontInfo.write(font.systemFontInfo) : null; + const cssFontInfoBuffer = font.cssFontInfo ? CssFontInfo.write(font.cssFontInfo) : null; + const encoder = new TextEncoder(); + const encodedStrings = {}; + let stringsLength = 0; + for (const prop of FontInfo.strings) { + encodedStrings[prop] = encoder.encode(font[prop]); + stringsLength += 4 + encodedStrings[prop].length; + } + const lengthEstimate = FontInfo.#OFFSET_STRINGS + 4 + stringsLength + 4 + (systemFontInfoBuffer ? systemFontInfoBuffer.byteLength : 0) + 4 + (cssFontInfoBuffer ? cssFontInfoBuffer.byteLength : 0) + 4 + (font.data ? font.data.length : 0); + const buffer = new ArrayBuffer(lengthEstimate); + const data = new Uint8Array(buffer); + const view = new DataView(buffer); + let offset = 0; + const numBools = FontInfo.bools.length; + let boolByte = 0, + boolBit = 0; + for (let i = 0; i < numBools; i++) { + const value = font[FontInfo.bools[i]]; + const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01; + boolByte |= bits << boolBit; + boolBit += 2; + if (boolBit === 8 || i === numBools - 1) { + view.setUint8(offset++, boolByte); + boolByte = 0; + boolBit = 0; + } + } + assert(offset === FontInfo.#OFFSET_NUMBERS, "FontInfo.write: Boolean properties offset mismatch"); + for (const prop of FontInfo.numbers) { + view.setFloat64(offset, font[prop]); + offset += 8; + } + assert(offset === FontInfo.#OFFSET_BBOX, "FontInfo.write: Number properties offset mismatch"); + if (font.bbox) { + view.setUint8(offset++, 4); + for (const coord of font.bbox) { + view.setInt16(offset, coord, true); + offset += 2; + } + } else { + view.setUint8(offset++, 0); + offset += 2 * 4; + } + assert(offset === FontInfo.#OFFSET_FONT_MATRIX, "FontInfo.write: BBox properties offset mismatch"); + if (font.fontMatrix) { + view.setUint8(offset++, 6); + for (const point of font.fontMatrix) { + view.setFloat64(offset, point, true); + offset += 8; + } + } else { + view.setUint8(offset++, 0); + offset += 8 * 6; + } + assert(offset === FontInfo.#OFFSET_DEFAULT_VMETRICS, "FontInfo.write: FontMatrix properties offset mismatch"); + if (font.defaultVMetrics) { + view.setUint8(offset++, 1); + for (const metric of font.defaultVMetrics) { + view.setInt16(offset, metric, true); + offset += 2; + } + } else { + view.setUint8(offset++, 0); + offset += 3 * 2; + } + assert(offset === FontInfo.#OFFSET_STRINGS, "FontInfo.write: DefaultVMetrics properties offset mismatch"); + view.setUint32(FontInfo.#OFFSET_STRINGS, 0); + offset += 4; + for (const prop of FontInfo.strings) { + const encoded = encodedStrings[prop]; + const length = encoded.length; + view.setUint32(offset, length); + data.set(encoded, offset + 4); + offset += 4 + length; + } + view.setUint32(FontInfo.#OFFSET_STRINGS, offset - FontInfo.#OFFSET_STRINGS - 4); + if (!systemFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = systemFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert(offset + 4 + length <= buffer.byteLength, "FontInfo.write: Buffer overflow at systemFontInfo"); + data.set(new Uint8Array(systemFontInfoBuffer), offset + 4); + offset += 4 + length; + } + if (!cssFontInfoBuffer) { + view.setUint32(offset, 0); + offset += 4; + } else { + const length = cssFontInfoBuffer.byteLength; + view.setUint32(offset, length); + assert(offset + 4 + length <= buffer.byteLength, "FontInfo.write: Buffer overflow at cssFontInfo"); + data.set(new Uint8Array(cssFontInfoBuffer), offset + 4); + offset += 4 + length; + } + if (font.data === undefined) { + view.setUint32(offset, 0); + offset += 4; + } else { + view.setUint32(offset, font.data.length); + data.set(font.data, offset + 4); + offset += 4 + font.data.length; + } + assert(offset <= buffer.byteLength, "FontInfo.write: Buffer overflow"); + return buffer.transferToFixedLength(offset); + } +} + +;// ./src/display/worker_options.js +class GlobalWorkerOptions { + static #port = null; + static #src = ""; + static get workerPort() { + return this.#port; + } + static set workerPort(val) { + if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) { + throw new Error("Invalid `workerPort` type."); + } + this.#port = val; + } + static get workerSrc() { + return this.#src; + } + static set workerSrc(val) { + if (typeof val !== "string") { + throw new Error("Invalid `workerSrc` type."); + } + this.#src = val; + } +} + +;// ./src/display/metadata.js +class Metadata { + #map; + #data; + constructor({ + parsedData, + rawData + }) { + this.#map = parsedData; + this.#data = rawData; + } + getRaw() { + return this.#data; + } + get(name) { + return this.#map.get(name) ?? null; + } + [Symbol.iterator]() { + return this.#map.entries(); + } +} + +;// ./src/display/optional_content_config.js + + +const INTERNAL = Symbol("INTERNAL"); +class OptionalContentGroup { + #isDisplay = false; + #isPrint = false; + #userSet = false; + #visible = true; + constructor(renderingIntent, { + name, + intent, + usage, + rbGroups + }) { + this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY); + this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + this.name = name; + this.intent = intent; + this.usage = usage; + this.rbGroups = rbGroups; + } + get visible() { + if (this.#userSet) { + return this.#visible; + } + if (!this.#visible) { + return false; + } + const { + print, + view + } = this.usage; + if (this.#isDisplay) { + return view?.viewState !== "OFF"; + } else if (this.#isPrint) { + return print?.printState !== "OFF"; + } + return true; + } + _setVisible(internal, visible, userSet = false) { + if (internal !== INTERNAL) { + unreachable("Internal method `_setVisible` called."); + } + this.#userSet = userSet; + this.#visible = visible; + } +} +class OptionalContentConfig { + #cachedGetHash = null; + #groups = new Map(); + #initialHash = null; + #order = null; + constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) { + this.renderingIntent = renderingIntent; + 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(renderingIntent, group)); + } + 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 { + 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) { + info("Optional content group not defined."); + return true; + } + if (group.type === "OCG") { + if (!this.#groups.has(group.id)) { + 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)) { + 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)) { + 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)) { + 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)) { + warn(`Optional content group not found: ${id}`); + return true; + } + if (this.#groups.get(id).visible) { + return false; + } + } + return true; + } + warn(`Unknown optional content policy ${group.policy}.`); + return true; + } + warn(`Unknown group type ${group.type}.`); + return true; + } + setVisibility(id, visible = true, preserveRB = true) { + const group = this.#groups.get(id); + if (!group) { + warn(`Optional content group not found: ${id}`); + return; + } + if (preserveRB && visible && group.rbGroups.length) { + for (const rbGroup of group.rbGroups) { + for (const otherId of rbGroup) { + if (otherId !== id) { + this.#groups.get(otherId)?._setVisible(INTERNAL, false, true); + } + } + } + } + group._setVisible(INTERNAL, !!visible, true); + this.#cachedGetHash = null; + } + setOCGState({ + state, + preserveRB + }) { + let operator; + for (const elem of state) { + switch (elem) { + case "ON": + case "OFF": + case "Toggle": + operator = elem; + continue; + } + const group = this.#groups.get(elem); + if (!group) { + continue; + } + switch (operator) { + case "ON": + this.setVisibility(elem, true, preserveRB); + break; + case "OFF": + this.setVisibility(elem, false, preserveRB); + break; + case "Toggle": + this.setVisibility(elem, !group.visible, preserveRB); + break; + } + } + this.#cachedGetHash = null; + } + get hasInitialVisibility() { + return this.#initialHash === null || this.getHash() === this.#initialHash; + } + getOrder() { + if (!this.#groups.size) { + return null; + } + if (this.#order) { + return this.#order.slice(); + } + return [...this.#groups.keys()]; + } + getGroup(id) { + return this.#groups.get(id) || null; + } + getHash() { + if (this.#cachedGetHash !== null) { + return this.#cachedGetHash; + } + const hash = new MurmurHash3_64(); + for (const [id, group] of this.#groups) { + hash.update(`${id}:${group.visible}`); + } + return this.#cachedGetHash = hash.hexdigest(); + } + [Symbol.iterator]() { + return this.#groups.entries(); + } +} + +;// ./src/display/transport_stream.js + + +class PDFDataTransportStream { + constructor(pdfDataRangeTransport, { + disableRange = false, + disableStream = false + }) { + assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.'); + const { + length, + initialData, + progressiveDone, + contentDispositionFilename + } = pdfDataRangeTransport; + 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 = []; + pdfDataRangeTransport.addRangeListener((begin, chunk) => { + this._onReceiveData({ + begin, + chunk + }); + }); + pdfDataRangeTransport.addProgressListener((loaded, total) => { + this._onProgress({ + loaded, + total + }); + }); + pdfDataRangeTransport.addProgressiveReadListener(chunk => { + this._onReceiveData({ + chunk + }); + }); + pdfDataRangeTransport.addProgressiveDoneListener(() => { + this._onProgressiveDone(); + }); + 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; + }); + 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() { + 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(); + } +} +class PDFDataTransportStreamReader { + constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) { + this._stream = stream; + this._done = progressiveDone || false; + this._filename = 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 = Promise.withResolvers(); + 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 = Promise.withResolvers(); + 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); + } +} + +;// ./src/display/content_disposition.js + +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 = stringToBytes(value); + value = decoder.decode(buffer); + needsEncodingFixup = false; + } catch {} + } + 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].replaceAll(/\\(.)/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.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function (matches, charset, encoding, text) { + if (encoding === "q" || encoding === "Q") { + text = text.replaceAll("_", " "); + text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) { + return String.fromCharCode(parseInt(hex, 16)); + }); + return textdecode(charset, text); + } + try { + text = atob(text); + } catch {} + return textdecode(charset, text); + }); + } + return ""; +} + +;// ./src/display/network_utils.js + + + +function createHeaders(isHttp, httpHeaders) { + const headers = new Headers(); + if (!isHttp || !httpHeaders || typeof httpHeaders !== "object") { + return headers; + } + for (const key in httpHeaders) { + const val = httpHeaders[key]; + if (val !== undefined) { + headers.append(key, val); + } + } + return headers; +} +function getResponseOrigin(url) { + return URL.parse(url)?.origin ?? null; +} +function validateRangeRequestCapabilities({ + responseHeaders, + isHttp, + rangeChunkSize, + disableRange +}) { + const returnValues = { + allowRangeRequests: false, + suggestedLength: undefined + }; + const length = parseInt(responseHeaders.get("Content-Length"), 10); + if (!Number.isInteger(length)) { + return returnValues; + } + returnValues.suggestedLength = length; + if (length <= 2 * rangeChunkSize) { + return returnValues; + } + if (disableRange || !isHttp) { + return returnValues; + } + if (responseHeaders.get("Accept-Ranges") !== "bytes") { + return returnValues; + } + const contentEncoding = responseHeaders.get("Content-Encoding") || "identity"; + if (contentEncoding !== "identity") { + return returnValues; + } + returnValues.allowRangeRequests = true; + return returnValues; +} +function extractFilenameFromHeader(responseHeaders) { + const contentDisposition = responseHeaders.get("Content-Disposition"); + if (contentDisposition) { + let filename = getFilenameFromContentDispositionHeader(contentDisposition); + if (filename.includes("%")) { + try { + filename = decodeURIComponent(filename); + } catch {} + } + if (isPdfFile(filename)) { + return filename; + } + } + return null; +} +function createResponseError(status, url) { + return new ResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status, status === 404 || status === 0 && url.startsWith("file:")); +} +function validateResponseStatus(status) { + return status === 200 || status === 206; +} + +;// ./src/display/fetch_stream.js + + +function createFetchOptions(headers, withCredentials, abortController) { + return { + method: "GET", + headers, + signal: abortController.signal, + mode: "cors", + credentials: withCredentials ? "include" : "same-origin", + redirect: "follow" + }; +} +function getArrayBuffer(val) { + if (val instanceof Uint8Array) { + return val.buffer; + } + if (val instanceof ArrayBuffer) { + return val; + } + warn(`getArrayBuffer - unexpected data format: ${val}`); + return new Uint8Array(val).buffer; +} +class PDFFetchStream { + _responseOrigin = null; + constructor(source) { + this.source = source; + this.isHttp = /^https?:/i.test(source.url); + this.headers = createHeaders(this.isHttp, source.httpHeaders); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + 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); + } + } +} +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 = Promise.withResolvers(); + 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; + const headers = new Headers(stream.headers); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + stream._responseOrigin = getResponseOrigin(response.url); + if (!validateResponseStatus(response.status)) { + throw createResponseError(response.status, url); + } + this._reader = response.body.getReader(); + this._headersCapability.resolve(); + const responseHeaders = response.headers; + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: stream.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + this._isRangeSupported = allowRangeRequests; + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new 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 = Promise.withResolvers(); + this._isStreamingSupported = !source.disableStream; + this._abortController = new AbortController(); + const headers = new Headers(stream.headers); + headers.append("Range", `bytes=${begin}-${end - 1}`); + const url = source.url; + fetch(url, createFetchOptions(headers, this._withCredentials, this._abortController)).then(response => { + const responseOrigin = getResponseOrigin(response.url); + if (responseOrigin !== stream._responseOrigin) { + throw new Error(`Expected range response-origin "${responseOrigin}" to match "${stream._responseOrigin}".`); + } + if (!validateResponseStatus(response.status)) { + throw createResponseError(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(); + } +} + +;// ./src/display/network.js + + +const OK_RESPONSE = 200; +const PARTIAL_CONTENT_RESPONSE = 206; +function network_getArrayBuffer(xhr) { + const data = xhr.response; + if (typeof data !== "string") { + return data; + } + return stringToBytes(data).buffer; +} +class NetworkManager { + _responseOrigin = null; + constructor({ + url, + httpHeaders, + withCredentials + }) { + this.url = url; + this.isHttp = /^https?:/i.test(url); + this.headers = createHeaders(this.isHttp, httpHeaders); + this.withCredentials = withCredentials || false; + this.currXhrId = 0; + this.pendingRequests = Object.create(null); + } + request(args) { + const xhr = new XMLHttpRequest(); + const xhrId = this.currXhrId++; + const pendingRequest = this.pendingRequests[xhrId] = { + xhr + }; + xhr.open("GET", this.url); + xhr.withCredentials = this.withCredentials; + for (const [key, val] of this.headers) { + xhr.setRequestHeader(key, val); + } + 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"; + assert(args.onError, "Expected `onError` callback to be provided."); + xhr.onerror = () => { + 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 = network_getArrayBuffer(xhr); + if (xhrStatus === PARTIAL_CONTENT_RESPONSE) { + const rangeHeader = xhr.getResponseHeader("Content-Range"); + const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); + if (matches) { + pendingRequest.onDone({ + begin: parseInt(matches[1], 10), + chunk + }); + } else { + warn(`Missing or invalid "Content-Range" header.`); + pendingRequest.onError(0); + } + } 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); + 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() { + 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); + } + } +} +class PDFNetworkStreamFullRequestReader { + constructor(manager, source) { + this._manager = manager; + this._url = source.url; + this._fullRequestId = manager.request({ + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._headersCapability = Promise.withResolvers(); + 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); + this._manager._responseOrigin = getResponseOrigin(fullRequestXhr.responseURL); + const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders(); + const responseHeaders = new Headers(rawResponseHeaders ? rawResponseHeaders.trimStart().replace(/[^\S ]+$/, "").split(/[\r\n]+/).map(x => { + const [key, ...val] = x.split(": "); + return [key, val.join(": ")]; + }) : []); + const { + allowRangeRequests, + suggestedLength + } = validateRangeRequestCapabilities({ + responseHeaders, + isHttp: this._manager.isHttp, + rangeChunkSize: this._rangeChunkSize, + disableRange: this._disableRange + }); + if (allowRangeRequests) { + this._isRangeSupported = true; + } + this._contentLength = suggestedLength || this._contentLength; + this._filename = extractFilenameFromHeader(responseHeaders); + if (this._isRangeSupported) { + this._manager.abortRequest(fullRequestXhrId); + } + this._headersCapability.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 = createResponseError(status, this._url); + this._headersCapability.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._headersCapability.promise; + } + async read() { + await this._headersCapability.promise; + 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 = Promise.withResolvers(); + this._requests.push(requestCapability); + return requestCapability.promise; + } + cancel(reason) { + this._done = true; + this._headersCapability.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; + this._url = manager.url; + this._requestId = manager.request({ + begin, + end, + onHeadersReceived: this._onHeadersReceived.bind(this), + onDone: this._onDone.bind(this), + onError: this._onError.bind(this), + onProgress: this._onProgress.bind(this) + }); + this._requests = []; + this._queuedChunk = null; + this._done = false; + this._storedError = undefined; + this.onProgress = null; + this.onClosed = null; + } + _onHeadersReceived() { + const responseOrigin = getResponseOrigin(this._manager.getRequestXhr(this._requestId)?.responseURL); + if (responseOrigin !== this._manager._responseOrigin) { + this._storedError = new Error(`Expected range response-origin "${responseOrigin}" to match "${this._manager._responseOrigin}".`); + this._onError(0); + } + } + _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 ??= createResponseError(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 = Promise.withResolvers(); + 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(); + } +} + +;// ./src/display/node_stream.js + + +const urlRegex = /^[a-z][a-z0-9\-+.]+:/i; +function parseUrlOrPath(sourceUrl) { + if (urlRegex.test(sourceUrl)) { + return new URL(sourceUrl); + } + const url = process.getBuiltinModule("url"); + return new URL(url.pathToFileURL(sourceUrl)); +} +class PDFNodeStream { + constructor(source) { + this.source = source; + this.url = parseUrlOrPath(source.url); + assert(this.url.protocol === "file:", "PDFNodeStream only supports file:// URLs."); + this._fullRequestReader = null; + this._rangeRequestReaders = []; + } + get _progressiveDataLength() { + return this._fullRequestReader?._loaded ?? 0; + } + getFullReader() { + assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once."); + this._fullRequestReader = new PDFNodeStreamFsFullReader(this); + return this._fullRequestReader; + } + getRangeReader(start, end) { + if (end <= this._progressiveDataLength) { + return null; + } + const rangeReader = new PDFNodeStreamFsRangeReader(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); + } + } +} +class PDFNodeStreamFsFullReader { + 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 = Promise.withResolvers(); + this._headersCapability = Promise.withResolvers(); + const fs = process.getBuiltinModule("fs"); + fs.promises.lstat(this._url).then(stat => { + this._contentLength = stat.size; + this._setReadableStream(fs.createReadStream(this._url)); + this._headersCapability.resolve(); + }, error => { + if (error.code === "ENOENT") { + error = createResponseError(0, this._url.href); + } + this._storedError = error; + this._headersCapability.reject(error); + }); + } + 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 = Promise.withResolvers(); + 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 AbortException("streaming is disabled")); + } + if (this._storedError) { + this._readableStream.destroy(this._storedError); + } + } +} +class PDFNodeStreamFsRangeReader { + constructor(stream, start, end) { + this._url = stream.url; + this._done = false; + this._storedError = null; + this.onProgress = null; + this._loaded = 0; + this._readableStream = null; + this._readCapability = Promise.withResolvers(); + const source = stream.source; + this._isStreamingSupported = !source.disableStream; + const fs = process.getBuiltinModule("fs"); + this._setReadableStream(fs.createReadStream(this._url, { + start, + end: end - 1 + })); + } + 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 = Promise.withResolvers(); + 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); + } + } +} + +;// ./src/display/pdf_objects.js +const INITIAL_DATA = Symbol("INITIAL_DATA"); +class PDFObjects { + #objs = Object.create(null); + #ensureObj(objId) { + return this.#objs[objId] ||= { + ...Promise.withResolvers(), + data: INITIAL_DATA + }; + } + get(objId, callback = null) { + if (callback) { + const obj = this.#ensureObj(objId); + obj.promise.then(() => callback(obj.data)); + return null; + } + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + throw new Error(`Requesting object that isn't resolved yet ${objId}.`); + } + return obj.data; + } + has(objId) { + const obj = this.#objs[objId]; + return !!obj && obj.data !== INITIAL_DATA; + } + delete(objId) { + const obj = this.#objs[objId]; + if (!obj || obj.data === INITIAL_DATA) { + return false; + } + delete this.#objs[objId]; + return true; + } + resolve(objId, data = null) { + const obj = this.#ensureObj(objId); + obj.data = data; + obj.resolve(); + } + clear() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + data?.bitmap?.close(); + } + this.#objs = Object.create(null); + } + *[Symbol.iterator]() { + for (const objId in this.#objs) { + const { + data + } = this.#objs[objId]; + if (data === INITIAL_DATA) { + continue; + } + yield [objId, data]; + } + } +} + +;// ./src/display/text_layer.js + + +const MAX_TEXT_DIVS_TO_RENDER = 100000; +const DEFAULT_FONT_SIZE = 30; +class TextLayer { + #capability = Promise.withResolvers(); + #container = null; + #disableProcessItems = false; + #fontInspectorEnabled = !!globalThis.FontInspector?.enabled; + #lang = null; + #layoutTextParams = null; + #pageHeight = 0; + #pageWidth = 0; + #reader = null; + #rootContainer = null; + #rotation = 0; + #scale = 0; + #styleCache = Object.create(null); + #textContentItemsStr = []; + #textContentSource = null; + #textDivs = []; + #textDivProperties = new WeakMap(); + #transform = null; + static #ascentCache = new Map(); + static #canvasContexts = new Map(); + static #canvasCtxFonts = new WeakMap(); + static #minFontSize = null; + static #pendingTextLayers = new Set(); + constructor({ + textContentSource, + container, + viewport + }) { + if (textContentSource instanceof ReadableStream) { + this.#textContentSource = textContentSource; + } else if (typeof textContentSource === "object") { + this.#textContentSource = new ReadableStream({ + start(controller) { + controller.enqueue(textContentSource); + controller.close(); + } + }); + } else { + throw new Error('No "textContentSource" parameter specified.'); + } + this.#container = this.#rootContainer = container; + this.#scale = viewport.scale * OutputScale.pixelRatio; + this.#rotation = viewport.rotation; + this.#layoutTextParams = { + div: null, + properties: null, + ctx: null + }; + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight]; + this.#pageWidth = pageWidth; + this.#pageHeight = pageHeight; + TextLayer.#ensureMinFontSizeComputed(); + setLayerDimensions(container, viewport); + this.#capability.promise.finally(() => { + TextLayer.#pendingTextLayers.delete(this); + this.#layoutTextParams = null; + this.#styleCache = null; + }).catch(() => {}); + } + static get fontFamilyMap() { + const { + isWindows, + isFirefox + } = util_FeatureTest.platform; + return shadow(this, "fontFamilyMap", new Map([["sans-serif", `${isWindows && isFirefox ? "Calibri, " : ""}sans-serif`], ["monospace", `${isWindows && isFirefox ? "Lucida Console, " : ""}monospace`]])); + } + render() { + const pump = () => { + this.#reader.read().then(({ + value, + done + }) => { + if (done) { + this.#capability.resolve(); + return; + } + this.#lang ??= value.lang; + Object.assign(this.#styleCache, value.styles); + this.#processItems(value.items); + pump(); + }, this.#capability.reject); + }; + this.#reader = this.#textContentSource.getReader(); + TextLayer.#pendingTextLayers.add(this); + pump(); + return this.#capability.promise; + } + update({ + viewport, + onBefore = null + }) { + const scale = viewport.scale * OutputScale.pixelRatio; + const rotation = viewport.rotation; + if (rotation !== this.#rotation) { + onBefore?.(); + this.#rotation = rotation; + setLayerDimensions(this.#rootContainer, { + rotation + }); + } + if (scale !== this.#scale) { + onBefore?.(); + this.#scale = scale; + const params = { + div: null, + properties: null, + ctx: TextLayer.#getCtx(this.#lang) + }; + for (const div of this.#textDivs) { + params.properties = this.#textDivProperties.get(div); + params.div = div; + this.#layout(params); + } + } + } + cancel() { + const abortEx = new AbortException("TextLayer task cancelled."); + this.#reader?.cancel(abortEx).catch(() => {}); + this.#reader = null; + this.#capability.reject(abortEx); + } + get textDivs() { + return this.#textDivs; + } + get textContentItemsStr() { + return this.#textContentItemsStr; + } + #processItems(items) { + if (this.#disableProcessItems) { + return; + } + this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang); + const textDivs = this.#textDivs, + textContentItemsStr = this.#textContentItemsStr; + for (const item of items) { + if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) { + warn("Ignoring additional textDivs for performance reasons."); + this.#disableProcessItems = true; + return; + } + 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) { + this.#container.setAttribute("id", `${item.id}`); + } + parent.append(this.#container); + } else if (item.type === "endMarkedContent") { + this.#container = this.#container.parentNode; + } + continue; + } + textContentItemsStr.push(item.str); + this.#appendText(item); + } + } + #appendText(geom) { + const textDiv = document.createElement("span"); + const textDivProperties = { + angle: 0, + canvasWidth: 0, + hasText: geom.str !== "", + hasEOL: geom.hasEOL, + fontSize: 0 + }; + this.#textDivs.push(textDiv); + const tx = Util.transform(this.#transform, geom.transform); + let angle = Math.atan2(tx[1], tx[0]); + const style = this.#styleCache[geom.fontName]; + if (style.vertical) { + angle += Math.PI / 2; + } + let fontFamily = this.#fontInspectorEnabled && style.fontSubstitution || style.fontFamily; + fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily; + const fontHeight = Math.hypot(tx[2], tx[3]); + const fontAscent = fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang); + 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(--total-scale-factor) *"; + const divStyle = textDiv.style; + if (this.#container === this.#rootContainer) { + divStyle.left = `${(100 * left / this.#pageWidth).toFixed(2)}%`; + divStyle.top = `${(100 * top / this.#pageHeight).toFixed(2)}%`; + } else { + divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`; + divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`; + } + divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`; + divStyle.fontFamily = fontFamily; + textDivProperties.fontSize = fontHeight; + textDiv.setAttribute("role", "presentation"); + textDiv.textContent = geom.str; + textDiv.dir = geom.dir; + if (this.#fontInspectorEnabled) { + textDiv.dataset.fontName = style.fontSubstitutionLoadedName || 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; + } + this.#textDivProperties.set(textDiv, textDivProperties); + this.#layoutTextParams.div = textDiv; + this.#layoutTextParams.properties = textDivProperties; + this.#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); + } + } + #layout(params) { + const { + div, + properties, + ctx + } = params; + const { + style + } = div; + let transform = ""; + if (TextLayer.#minFontSize > 1) { + transform = `scale(${1 / TextLayer.#minFontSize})`; + } + if (properties.canvasWidth !== 0 && properties.hasText) { + const { + fontFamily + } = style; + const { + canvasWidth, + fontSize + } = properties; + TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily); + const { + width + } = ctx.measureText(div.textContent); + if (width > 0) { + transform = `scaleX(${canvasWidth * this.#scale / width}) ${transform}`; + } + } + if (properties.angle !== 0) { + transform = `rotate(${properties.angle}deg) ${transform}`; + } + if (transform.length > 0) { + style.transform = transform; + } + } + static cleanup() { + if (this.#pendingTextLayers.size > 0) { + return; + } + this.#ascentCache.clear(); + for (const { + canvas + } of this.#canvasContexts.values()) { + canvas.remove(); + } + this.#canvasContexts.clear(); + } + static #getCtx(lang = null) { + let ctx = this.#canvasContexts.get(lang ||= ""); + if (!ctx) { + const canvas = document.createElement("canvas"); + canvas.className = "hiddenCanvasElement"; + canvas.lang = lang; + document.body.append(canvas); + ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: true + }); + this.#canvasContexts.set(lang, ctx); + this.#canvasCtxFonts.set(ctx, { + size: 0, + family: "" + }); + } + return ctx; + } + static #ensureCtxFont(ctx, size, family) { + const cached = this.#canvasCtxFonts.get(ctx); + if (size === cached.size && family === cached.family) { + return; + } + ctx.font = `${size}px ${family}`; + cached.size = size; + cached.family = family; + } + static #ensureMinFontSizeComputed() { + if (this.#minFontSize !== null) { + return; + } + const div = document.createElement("div"); + div.style.opacity = 0; + div.style.lineHeight = 1; + div.style.fontSize = "1px"; + div.style.position = "absolute"; + div.textContent = "X"; + document.body.append(div); + this.#minFontSize = div.getBoundingClientRect().height; + div.remove(); + } + static #getAscent(fontFamily, style, lang) { + const cachedAscent = this.#ascentCache.get(fontFamily); + if (cachedAscent) { + return cachedAscent; + } + const ctx = this.#getCtx(lang); + ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE; + this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily); + const metrics = ctx.measureText(""); + const ascent = metrics.fontBoundingBoxAscent; + const descent = Math.abs(metrics.fontBoundingBoxDescent); + ctx.canvas.width = ctx.canvas.height = 0; + let ratio = 0.8; + if (ascent) { + ratio = ascent / (ascent + descent); + } else { + if (util_FeatureTest.platform.isFirefox) { + warn("Enable the `dom.textMetrics.fontBoundingBox.enabled` preference " + "in `about:config` to improve TextLayer rendering."); + } + if (style.ascent) { + ratio = style.ascent; + } else if (style.descent) { + ratio = 1 + style.descent; + } + } + this.#ascentCache.set(fontFamily, ratio); + return ratio; + } +} + +;// ./src/display/api.js + + + + + + + + + + + + + + + + + + + + + + + + + +const RENDERING_CANCELLED_TIMEOUT = 100; +function getDocument(src = {}) { + if (typeof src === "string" || src instanceof URL) { + src = { + url: src + }; + } else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) { + src = { + data: src + }; + } + const task = new PDFDocumentLoadingTask(); + const { + docId + } = task; + const url = src.url ? getUrlProp(src.url) : null; + const data = src.data ? getDataProp(src.data) : null; + const httpHeaders = src.httpHeaders || null; + const withCredentials = src.withCredentials === true; + const password = src.password ?? null; + const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null; + const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : 2 ** 16; + let worker = src.worker instanceof PDFWorker ? src.worker : null; + const verbosity = src.verbosity; + const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null; + const cMapUrl = getFactoryUrlProp(src.cMapUrl); + const cMapPacked = src.cMapPacked !== false; + const CMapReaderFactory = src.CMapReaderFactory || (isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory); + const iccUrl = getFactoryUrlProp(src.iccUrl); + const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl); + const StandardFontDataFactory = src.StandardFontDataFactory || (isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory); + const wasmUrl = getFactoryUrlProp(src.wasmUrl); + const WasmFactory = src.WasmFactory || (isNodeJS ? NodeWasmFactory : DOMWasmFactory); + const ignoreErrors = src.stopAtErrors !== true; + const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1; + const isEvalSupported = src.isEvalSupported !== false; + const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS; + const isImageDecoderSupported = typeof src.isImageDecoderSupported === "boolean" ? src.isImageDecoderSupported : !isNodeJS && (util_FeatureTest.platform.isFirefox || !globalThis.chrome); + const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1; + const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS; + const fontExtraProperties = src.fontExtraProperties === true; + const enableXfa = src.enableXfa === true; + const ownerDocument = src.ownerDocument || globalThis.document; + const disableRange = src.disableRange === true; + const disableStream = src.disableStream === true; + const disableAutoFetch = src.disableAutoFetch === true; + const pdfBug = src.pdfBug === true; + const CanvasFactory = src.CanvasFactory || (isNodeJS ? NodeCanvasFactory : DOMCanvasFactory); + const FilterFactory = src.FilterFactory || (isNodeJS ? NodeFilterFactory : DOMFilterFactory); + const enableHWA = src.enableHWA === true; + const useWasm = src.useWasm !== false; + const length = rangeTransport ? rangeTransport.length : src.length ?? NaN; + const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace; + const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : !!(CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && WasmFactory === DOMWasmFactory && cMapUrl && standardFontDataUrl && wasmUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI) && isValidFetchUrl(wasmUrl, document.baseURI)); + const styleElement = null; + setVerbosityLevel(verbosity); + const transportFactory = { + canvasFactory: new CanvasFactory({ + ownerDocument, + enableHWA + }), + filterFactory: new FilterFactory({ + docId, + ownerDocument + }), + cMapReaderFactory: useWorkerFetch ? null : new CMapReaderFactory({ + baseUrl: cMapUrl, + isCompressed: cMapPacked + }), + standardFontDataFactory: useWorkerFetch ? null : new StandardFontDataFactory({ + baseUrl: standardFontDataUrl + }), + wasmFactory: useWorkerFetch ? null : new WasmFactory({ + baseUrl: wasmUrl + }) + }; + if (!worker) { + worker = PDFWorker.create({ + verbosity, + port: GlobalWorkerOptions.workerPort + }); + task._worker = worker; + } + const docParams = { + docId, + apiVersion: "5.4.296", + data, + password, + disableAutoFetch, + rangeChunkSize, + length, + docBaseUrl, + enableXfa, + evaluatorOptions: { + maxImageSize, + disableFontFace, + ignoreErrors, + isEvalSupported, + isOffscreenCanvasSupported, + isImageDecoderSupported, + canvasMaxAreaInBytes, + fontExtraProperties, + useSystemFonts, + useWasm, + useWorkerFetch, + cMapUrl, + iccUrl, + standardFontDataUrl, + wasmUrl + } + }; + const transportParams = { + ownerDocument, + pdfBug, + styleElement, + loadingParams: { + disableAutoFetch, + enableXfa + } + }; + worker.promise.then(function () { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null); + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream(rangeTransport, { + disableRange, + disableStream + }); + } else if (!data) { + if (!url) { + throw new Error("getDocument - no `url` parameter provided."); + } + const NetworkStream = isValidFetchUrl(url) ? PDFFetchStream : isNodeJS ? PDFNodeStream : PDFNetworkStream; + networkStream = new NetworkStream({ + url, + length, + httpHeaders, + withCredentials, + rangeChunkSize, + disableRange, + disableStream + }); + } + return workerIdPromise.then(workerId => { + if (task.destroyed) { + throw new Error("Loading aborted"); + } + if (worker.destroyed) { + throw new Error("Worker was destroyed"); + } + const messageHandler = new MessageHandler(docId, workerId, worker.port); + const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory, enableHWA); + task._transport = transport; + messageHandler.send("Ready", null); + }); + }).catch(task._capability.reject); + return task; +} +class PDFDocumentLoadingTask { + static #docId = 0; + _capability = Promise.withResolvers(); + _transport = null; + _worker = null; + docId = `d${PDFDocumentLoadingTask.#docId++}`; + destroyed = false; + onPassword = null; + onProgress = null; + get promise() { + return this._capability.promise; + } + async destroy() { + this.destroyed = true; + try { + if (this._worker?.port) { + this._worker._pendingDestroy = true; + } + await this._transport?.destroy(); + } catch (ex) { + if (this._worker?.port) { + delete this._worker._pendingDestroy; + } + throw ex; + } + this._transport = null; + this._worker?.destroy(); + this._worker = null; + } + async getData() { + return this._transport.getData(); + } +} +class PDFDataRangeTransport { + #capability = Promise.withResolvers(); + #progressiveDoneListeners = []; + #progressiveReadListeners = []; + #progressListeners = []; + #rangeListeners = []; + constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) { + this.length = length; + this.initialData = initialData; + this.progressiveDone = progressiveDone; + this.contentDispositionFilename = contentDispositionFilename; + } + 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.#capability.promise.then(() => { + for (const listener of this.#progressListeners) { + listener(loaded, total); + } + }); + } + onDataProgressiveRead(chunk) { + this.#capability.promise.then(() => { + for (const listener of this.#progressiveReadListeners) { + listener(chunk); + } + }); + } + onDataProgressiveDone() { + this.#capability.promise.then(() => { + for (const listener of this.#progressiveDoneListeners) { + listener(); + } + }); + } + transportReady() { + this.#capability.resolve(); + } + requestDataRange(begin, end) { + unreachable("Abstract method PDFDataRangeTransport.requestDataRange"); + } + abort() {} +} +class PDFDocumentProxy { + constructor(pdfInfo, transport) { + this._pdfInfo = pdfInfo; + this._transport = transport; + } + get annotationStorage() { + return this._transport.annotationStorage; + } + get canvasFactory() { + return this._transport.canvasFactory; + } + get filterFactory() { + return this._transport.filterFactory; + } + get numPages() { + return this._pdfInfo.numPages; + } + get fingerprints() { + return this._pdfInfo.fingerprints; + } + get isPureXfa() { + return 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(); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this._transport.getAnnotationsByType(types, pageIndexesToSkip); + } + getJSActions() { + return this._transport.getDocJSActions(); + } + getOutline() { + return this._transport.getOutline(); + } + getOptionalContentConfig({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getOptionalContentConfig(renderingIntent); + } + 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(); + } + cachedPageNumber(ref) { + return this._transport.cachedPageNumber(ref); + } + 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(); + } +} +class PDFPageProxy { + #pendingCleanup = false; + constructor(pageIndex, pageInfo, transport, pdfBug = false) { + this._pageIndex = pageIndex; + this._pageInfo = pageInfo; + this._transport = transport; + this._stats = pdfBug ? new StatTimer() : null; + this._pdfBug = pdfBug; + this.commonObjs = transport.commonObjs; + this.objs = new PDFObjects(); + this._intentStates = new Map(); + this.destroyed = false; + this.recordedBBoxes = null; + } + 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 PageViewport({ + viewBox: this.view, + userUnit: this.userUnit, + scale, + rotation, + offsetX, + offsetY, + dontFlip + }); + } + getAnnotations({ + intent = "display" + } = {}) { + const { + renderingIntent + } = this._transport.getRenderingIntent(intent); + return this._transport.getAnnotations(this._pageIndex, renderingIntent); + } + getJSActions() { + return this._transport.getPageJSActions(this._pageIndex); + } + get filterFactory() { + return this._transport.filterFactory; + } + get isPureXfa() { + return shadow(this, "isPureXfa", !!this._transport._htmlForXfa); + } + async getXfa() { + return this._transport._htmlForXfa?.children[this._pageIndex] || null; + } + render({ + canvasContext, + canvas = canvasContext.canvas, + viewport, + intent = "display", + annotationMode = AnnotationMode.ENABLE, + transform = null, + background = null, + optionalContentConfigPromise = null, + annotationCanvasMap = null, + pageColors = null, + printAnnotationStorage = null, + isEditing = false, + recordOperations = false, + operationsFilter = null + }) { + this._stats?.time("Overall"); + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing); + const { + renderingIntent, + cacheKey + } = intentArgs; + this.#pendingCleanup = false; + optionalContentConfigPromise ||= this._transport.getOptionalContentConfig(renderingIntent); + let intentState = this._intentStates.get(cacheKey); + if (!intentState) { + intentState = Object.create(null); + this._intentStates.set(cacheKey, intentState); + } + if (intentState.streamReaderCancelTimeout) { + clearTimeout(intentState.streamReaderCancelTimeout); + intentState.streamReaderCancelTimeout = null; + } + const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT); + if (!intentState.displayReadyCapability) { + intentState.displayReadyCapability = Promise.withResolvers(); + intentState.operatorList = { + fnArray: [], + argsArray: [], + lastChunk: false, + separateAnnots: null + }; + this._stats?.time("Page Request"); + this._pumpOperatorList(intentArgs); + } + const recordForDebugger = Boolean(this._pdfBug && globalThis.StepperManager?.enabled); + const shouldRecordOperations = !this.recordedBBoxes && (recordOperations || recordForDebugger); + const complete = error => { + intentState.renderTasks.delete(internalRenderTask); + if (shouldRecordOperations) { + const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take(); + if (recordedBBoxes) { + if (internalRenderTask.stepper) { + internalRenderTask.stepper.setOperatorBBoxes(recordedBBoxes, internalRenderTask.gfx.dependencyTracker.takeDebugMetadata()); + } + if (recordOperations) { + this.recordedBBoxes = recordedBBoxes; + } + } + } + if (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(); + } + if (this._stats) { + this._stats.timeEnd("Rendering"); + this._stats.timeEnd("Overall"); + if (globalThis.Stats?.enabled) { + globalThis.Stats.add(this.pageNumber, this._stats); + } + } + }; + const internalRenderTask = new InternalRenderTask({ + callback: complete, + params: { + canvas, + canvasContext, + dependencyTracker: shouldRecordOperations ? new CanvasDependencyTracker(canvas, intentState.operatorList.length, recordForDebugger) : null, + viewport, + transform, + background + }, + objs: this.objs, + commonObjs: this.commonObjs, + annotationCanvasMap, + operatorList: intentState.operatorList, + pageIndex: this._pageIndex, + canvasFactory: this._transport.canvasFactory, + filterFactory: this._transport.filterFactory, + useRequestAnimationFrame: !intentPrint, + pdfBug: this._pdfBug, + pageColors, + enableHWA: this._transport.enableHWA, + operationsFilter + }); + (intentState.renderTasks ||= new Set()).add(internalRenderTask); + const renderTask = internalRenderTask.task; + Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => { + if (this.destroyed) { + complete(); + return; + } + this._stats?.time("Rendering"); + if (!(optionalContentConfig.renderingIntent & renderingIntent)) { + throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` " + "and `PDFDocumentProxy.getOptionalContentConfig` methods."); + } + internalRenderTask.initializeGraphics({ + transparency, + optionalContentConfig + }); + internalRenderTask.operatorListChanged(); + }).catch(complete); + return renderTask; + } + getOperatorList({ + intent = "display", + annotationMode = AnnotationMode.ENABLE, + printAnnotationStorage = null, + isEditing = false + } = {}) { + function operatorListChanged() { + if (intentState.operatorList.lastChunk) { + intentState.opListReadCapability.resolve(intentState.operatorList); + intentState.renderTasks.delete(opListTask); + } + } + const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, 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 = Promise.withResolvers(); + (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({ + includeMarkedContent = false, + disableNormalization = false + } = {}) { + const TEXT_CONTENT_CHUNK_SIZE = 100; + return this._transport.messageHandler.sendWithStream("GetTextContent", { + pageIndex: this._pageIndex, + includeMarkedContent: includeMarkedContent === true, + disableNormalization: disableNormalization === true + }, { + highWaterMark: TEXT_CONTENT_CHUNK_SIZE, + size(textContent) { + return textContent.items.length; + } + }); + } + getTextContent(params = {}) { + if (this._transport._htmlForXfa) { + return this.getXfa().then(xfa => 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; + } + textContent.lang ??= value.lang; + Object.assign(textContent.styles, value.styles); + textContent.items.push(...value.items); + pump(); + }, reject); + } + const reader = readableStream.getReader(); + const textContent = { + items: [], + styles: Object.create(null), + lang: 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(); + this.#pendingCleanup = false; + return Promise.all(waitOn); + } + cleanup(resetStats = false) { + this.#pendingCleanup = true; + const success = this.#tryCleanup(); + if (resetStats && success) { + this._stats &&= new StatTimer(); + } + return success; + } + #tryCleanup() { + if (!this.#pendingCleanup || this.destroyed) { + return false; + } + for (const { + renderTasks, + operatorList + } of this._intentStates.values()) { + if (renderTasks.size > 0 || !operatorList.lastChunk) { + return false; + } + } + this._intentStates.clear(); + this.objs.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, + annotationStorageSerializable, + modifiedIds + }) { + const { + map, + transfer + } = annotationStorageSerializable; + const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", { + pageIndex: this._pageIndex, + intent: renderingIntent, + cacheKey, + annotationStorage: map, + modifiedIds + }, transfer); + 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 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 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; + } +} +class PDFWorker { + #capability = Promise.withResolvers(); + #messageHandler = null; + #port = null; + #webWorker = null; + static #fakeWorkerId = 0; + static #isWorkerDisabled = false; + static #workerPorts = new WeakMap(); + static { + if (isNodeJS) { + this.#isWorkerDisabled = true; + GlobalWorkerOptions.workerSrc ||= "./pdf.worker.mjs"; + } + this._isSameOrigin = (baseUrl, otherUrl) => { + const base = URL.parse(baseUrl); + if (!base?.origin || base.origin === "null") { + return false; + } + const other = new URL(otherUrl, base); + return base.origin === other.origin; + }; + this._createCDNWrapper = url => { + const wrapper = `await import("${url}");`; + return URL.createObjectURL(new Blob([wrapper], { + type: "text/javascript" + })); + }; + this.fromPort = params => { + deprecated("`PDFWorker.fromPort` - please use `PDFWorker.create` instead."); + if (!params?.port) { + throw new Error("PDFWorker.fromPort - invalid method signature."); + } + return this.create(params); + }; + } + constructor({ + name = null, + port = null, + verbosity = getVerbosityLevel() + } = {}) { + this.name = name; + this.destroyed = false; + this.verbosity = verbosity; + if (port) { + if (PDFWorker.#workerPorts.has(port)) { + throw new Error("Cannot use more than one PDFWorker per port."); + } + PDFWorker.#workerPorts.set(port, this); + this.#initializeFromPort(port); + } else { + this.#initialize(); + } + } + get promise() { + return this.#capability.promise; + } + #resolve() { + this.#capability.resolve(); + this.#messageHandler.send("configure", { + verbosity: this.verbosity + }); + } + get port() { + return this.#port; + } + get messageHandler() { + return this.#messageHandler; + } + #initializeFromPort(port) { + this.#port = port; + this.#messageHandler = new MessageHandler("main", "worker", port); + this.#messageHandler.on("ready", () => {}); + this.#resolve(); + } + #initialize() { + if (PDFWorker.#isWorkerDisabled || PDFWorker.#mainThreadWorkerMessageHandler) { + this.#setupFakeWorker(); + return; + } + let { + workerSrc + } = PDFWorker; + try { + if (!PDFWorker._isSameOrigin(window.location, workerSrc)) { + workerSrc = PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href); + } + const worker = new Worker(workerSrc, { + type: "module" + }); + const messageHandler = new MessageHandler("main", "worker", worker); + const terminateEarly = () => { + ac.abort(); + messageHandler.destroy(); + worker.terminate(); + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + } else { + this.#setupFakeWorker(); + } + }; + const ac = new AbortController(); + worker.addEventListener("error", () => { + if (!this.#webWorker) { + terminateEarly(); + } + }, { + signal: ac.signal + }); + messageHandler.on("test", data => { + ac.abort(); + if (this.destroyed || !data) { + terminateEarly(); + return; + } + this.#messageHandler = messageHandler; + this.#port = worker; + this.#webWorker = worker; + this.#resolve(); + }); + messageHandler.on("ready", data => { + ac.abort(); + if (this.destroyed) { + terminateEarly(); + return; + } + try { + sendTest(); + } catch { + this.#setupFakeWorker(); + } + }); + const sendTest = () => { + const testObj = new Uint8Array(); + messageHandler.send("test", testObj, [testObj.buffer]); + }; + sendTest(); + return; + } catch { + info("The worker has been disabled."); + } + this.#setupFakeWorker(); + } + #setupFakeWorker() { + if (!PDFWorker.#isWorkerDisabled) { + warn("Setting up fake worker."); + PDFWorker.#isWorkerDisabled = true; + } + PDFWorker._setupFakeWorkerGlobal.then(WorkerMessageHandler => { + if (this.destroyed) { + this.#capability.reject(new Error("Worker was destroyed")); + return; + } + const port = new LoopbackPort(); + this.#port = port; + const id = `fake${PDFWorker.#fakeWorkerId++}`; + const workerHandler = new MessageHandler(id + "_worker", id, port); + WorkerMessageHandler.setup(workerHandler, port); + this.#messageHandler = new MessageHandler(id, id + "_worker", port); + this.#resolve(); + }).catch(reason => { + this.#capability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`)); + }); + } + destroy() { + this.destroyed = true; + this.#webWorker?.terminate(); + this.#webWorker = null; + PDFWorker.#workerPorts.delete(this.#port); + this.#port = null; + this.#messageHandler?.destroy(); + this.#messageHandler = null; + } + static create(params) { + const cachedPort = this.#workerPorts.get(params?.port); + if (cachedPort) { + if (cachedPort._pendingDestroy) { + throw new Error("PDFWorker.create - the worker is being destroyed.\n" + "Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."); + } + return cachedPort; + } + return new PDFWorker(params); + } + static get workerSrc() { + if (GlobalWorkerOptions.workerSrc) { + return GlobalWorkerOptions.workerSrc; + } + throw new Error('No "GlobalWorkerOptions.workerSrc" specified.'); + } + static get #mainThreadWorkerMessageHandler() { + try { + return globalThis.pdfjsWorker?.WorkerMessageHandler || null; + } catch { + return null; + } + } + static get _setupFakeWorkerGlobal() { + const loader = async () => { + if (this.#mainThreadWorkerMessageHandler) { + return this.#mainThreadWorkerMessageHandler; + } + const worker = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + this.workerSrc); + return worker.WorkerMessageHandler; + }; + return shadow(this, "_setupFakeWorkerGlobal", loader()); + } +} +class WorkerTransport { + #methodPromises = new Map(); + #pageCache = new Map(); + #pagePromises = new Map(); + #pageRefCache = new Map(); + #passwordCapability = null; + constructor(messageHandler, loadingTask, networkStream, params, factory, enableHWA) { + this.messageHandler = messageHandler; + this.loadingTask = loadingTask; + this.commonObjs = new PDFObjects(); + this.fontLoader = new FontLoader({ + ownerDocument: params.ownerDocument, + styleElement: params.styleElement + }); + this.loadingParams = params.loadingParams; + this._params = params; + this.canvasFactory = factory.canvasFactory; + this.filterFactory = factory.filterFactory; + this.cMapReaderFactory = factory.cMapReaderFactory; + this.standardFontDataFactory = factory.standardFontDataFactory; + this.wasmFactory = factory.wasmFactory; + this.destroyed = false; + this.destroyCapability = null; + this._networkStream = networkStream; + this._fullReader = null; + this._lastProgress = null; + this.downloadInfoCapability = Promise.withResolvers(); + this.enableHWA = enableHWA; + this.setupMessageHandler(); + } + #cacheSimpleMethod(name, data = null) { + const cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, data); + this.#methodPromises.set(name, promise); + return promise; + } + get annotationStorage() { + return shadow(this, "annotationStorage", new AnnotationStorage()); + } + getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) { + let renderingIntent = RenderingIntentFlag.DISPLAY; + let annotationStorageSerializable = SerializableEmpty; + switch (intent) { + case "any": + renderingIntent = RenderingIntentFlag.ANY; + break; + case "display": + break; + case "print": + renderingIntent = RenderingIntentFlag.PRINT; + break; + default: + warn(`getRenderingIntent - invalid intent: ${intent}`); + } + const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage; + switch (annotationMode) { + case AnnotationMode.DISABLE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE; + break; + case AnnotationMode.ENABLE: + break; + case AnnotationMode.ENABLE_FORMS: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS; + break; + case AnnotationMode.ENABLE_STORAGE: + renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE; + annotationStorageSerializable = annotationStorage.serializable; + break; + default: + warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`); + } + if (isEditing) { + renderingIntent += RenderingIntentFlag.IS_EDITING; + } + if (isOpList) { + renderingIntent += RenderingIntentFlag.OPLIST; + } + const { + ids: modifiedIds, + hash: modifiedIdsHash + } = annotationStorage.modifiedIds; + const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash]; + return { + renderingIntent, + cacheKey: cacheKeyBuf.join("_"), + annotationStorageSerializable, + modifiedIds + }; + } + destroy() { + if (this.destroyCapability) { + return this.destroyCapability.promise; + } + this.destroyed = true; + this.destroyCapability = Promise.withResolvers(); + 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(); + this.#pageRefCache.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.#methodPromises.clear(); + this.filterFactory.destroy(); + TextLayer.cleanup(); + this._networkStream?.cancelAllRequests(new AbortException("Worker was terminated.")); + 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) => { + 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; + } + 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", async data => { + await this._fullReader.headersReady; + const { + isStreamingSupported, + isRangeSupported, + contentLength + } = this._fullReader; + if (!isStreamingSupported || !isRangeSupported) { + if (this._lastProgress) { + loadingTask.onProgress?.(this._lastProgress); + } + this._fullReader.onProgress = evt => { + loadingTask.onProgress?.({ + loaded: evt.loaded, + total: evt.total + }); + }; + } + return { + isStreamingSupported, + isRangeSupported, + contentLength + }; + }); + messageHandler.on("GetRangeReader", (data, sink) => { + 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; + } + 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", ex => { + loadingTask._capability.reject(wrapReason(ex)); + }); + messageHandler.on("PasswordRequest", ex => { + this.#passwordCapability = Promise.withResolvers(); + try { + if (!loadingTask.onPassword) { + throw wrapReason(ex); + } + const updatePassword = password => { + if (password instanceof Error) { + this.#passwordCapability.reject(password); + } else { + this.#passwordCapability.resolve({ + password + }); + } + }; + loadingTask.onPassword(updatePassword, ex.code); + } catch (err) { + this.#passwordCapability.reject(err); + } + 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 null; + } + if (this.commonObjs.has(id)) { + return null; + } + switch (type) { + case "Font": + if ("error" in exportedData) { + const exportedError = exportedData.error; + warn(`Error during font loading: ${exportedError}`); + this.commonObjs.resolve(id, exportedError); + break; + } + const fontData = new FontInfo(exportedData); + const inspectFont = this._params.pdfBug && globalThis.FontInspector?.enabled ? (font, url) => globalThis.FontInspector.fontAdded(font, url) : null; + const font = new FontFaceObject(fontData, inspectFont, exportedData.extra, exportedData.charProcOperatorList); + this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", { + id + })).finally(() => { + if (!font.fontExtraProperties && font.data) { + font.clearData(); + } + this.commonObjs.resolve(id, font); + }); + break; + case "CopyLocalImage": + const { + imageRef + } = exportedData; + assert(imageRef, "The imageRef must be defined."); + for (const pageProxy of this.#pageCache.values()) { + for (const [, data] of pageProxy.objs) { + if (data?.ref !== imageRef) { + continue; + } + if (!data.dataLen) { + return null; + } + this.commonObjs.resolve(id, structuredClone(data)); + return data.dataLen; + } + } + break; + case "FontPath": + case "Image": + case "Pattern": + this.commonObjs.resolve(id, exportedData); + break; + default: + throw new Error(`Got unknown common object type ${type}`); + } + return null; + }); + messageHandler.on("obj", ([id, pageIndex, type, imageData]) => { + if (this.destroyed) { + return; + } + const pageProxy = this.#pageCache.get(pageIndex); + if (pageProxy.objs.has(id)) { + return; + } + if (pageProxy._intentStates.size === 0) { + imageData?.bitmap?.close(); + return; + } + switch (type) { + case "Image": + 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("FetchBinaryData", async data => { + if (this.destroyed) { + throw new Error("Worker was destroyed."); + } + const factory = this[data.type]; + if (!factory) { + throw new Error(`${data.type} not initialized, see the \`useWorkerFetch\` parameter.`); + } + return factory.fetch(data); + }); + } + getData() { + return this.messageHandler.sendWithPromise("GetData", null); + } + saveDocument() { + if (this.annotationStorage.size <= 0) { + warn("saveDocument called while `annotationStorage` is empty, " + "please use the getData-method instead."); + } + const { + map, + transfer + } = this.annotationStorage.serializable; + return this.messageHandler.sendWithPromise("SaveDocument", { + isPureXfa: !!this._htmlForXfa, + numPages: this._numPages, + annotationStorage: map, + filename: this._fullReader?.filename ?? null + }, transfer).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"); + } + if (pageInfo.refStr) { + this.#pageRefCache.set(pageInfo.refStr, pageNumber); + } + const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug); + this.#pageCache.set(pageIndex, page); + return page; + }); + this.#pagePromises.set(pageIndex, promise); + return promise; + } + getPageIndex(ref) { + if (!isRefProxy(ref)) { + 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.#cacheSimpleMethod("GetFieldObjects"); + } + hasJSActions() { + return this.#cacheSimpleMethod("HasJSActions"); + } + 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); + } + getAnnotationsByType(types, pageIndexesToSkip) { + return this.messageHandler.sendWithPromise("GetAnnotationsByType", { + types, + pageIndexesToSkip + }); + } + getDocJSActions() { + return this.#cacheSimpleMethod("GetDocJSActions"); + } + getPageJSActions(pageIndex) { + return this.messageHandler.sendWithPromise("GetPageJSActions", { + pageIndex + }); + } + getStructTree(pageIndex) { + return this.messageHandler.sendWithPromise("GetStructTree", { + pageIndex + }); + } + getOutline() { + return this.messageHandler.sendWithPromise("GetOutline", null); + } + getOptionalContentConfig(renderingIntent) { + return this.#cacheSimpleMethod("GetOptionalContentConfig").then(data => new OptionalContentConfig(data, renderingIntent)); + } + getPermissions() { + return this.messageHandler.sendWithPromise("GetPermissions", null); + } + getMetadata() { + const name = "GetMetadata", + cachedPromise = this.#methodPromises.get(name); + if (cachedPromise) { + return cachedPromise; + } + const promise = this.messageHandler.sendWithPromise(name, null).then(results => ({ + info: results[0], + metadata: results[1] ? new Metadata(results[1]) : null, + contentDispositionFilename: this._fullReader?.filename ?? null, + contentLength: this._fullReader?.contentLength ?? null + })); + this.#methodPromises.set(name, promise); + return promise; + } + 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.#methodPromises.clear(); + this.filterFactory.destroy(true); + TextLayer.cleanup(); + } + cachedPageNumber(ref) { + if (!isRefProxy(ref)) { + return null; + } + const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`; + return this.#pageRefCache.get(refStr) ?? null; + } +} +class RenderTask { + #internalRenderTask = null; + onContinue = null; + onError = null; + constructor(internalRenderTask) { + this.#internalRenderTask = internalRenderTask; + } + 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; + } +} +class InternalRenderTask { + #rAF = null; + static #canvasInUse = new WeakSet(); + constructor({ + callback, + params, + objs, + commonObjs, + annotationCanvasMap, + operatorList, + pageIndex, + canvasFactory, + filterFactory, + useRequestAnimationFrame = false, + pdfBug = false, + pageColors = null, + enableHWA = false, + operationsFilter = 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.filterFactory = filterFactory; + 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 = Promise.withResolvers(); + 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.canvas; + this._canvasContext = params.canvas ? null : params.canvasContext; + this._enableHWA = enableHWA; + this._dependencyTracker = params.dependencyTracker; + this._operationsFilter = operationsFilter; + } + 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 { + viewport, + transform, + background, + dependencyTracker + } = this.params; + const canvasContext = this._canvasContext || this._canvas.getContext("2d", { + alpha: false, + willReadFrequently: !this._enableHWA + }); + this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, { + optionalContentConfig + }, this.annotationCanvasMap, this.pageColors, dependencyTracker); + 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.#rAF) { + window.cancelAnimationFrame(this.#rAF); + this.#rAF = null; + } + InternalRenderTask.#canvasInUse.delete(this._canvas); + error ||= new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay); + this.callback(error); + this.task.onError?.(error); + } + operatorListChanged() { + if (!this.graphicsReady) { + this.graphicsReadyCallback ||= this._continueBound; + return; + } + this.gfx.dependencyTracker?.growOperationsCount(this.operatorList.fnArray.length); + 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) { + this.#rAF = window.requestAnimationFrame(() => { + this.#rAF = null; + 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, this._operationsFilter); + if (this.operatorListIdx === this.operatorList.argsArray.length) { + this.running = false; + if (this.operatorList.lastChunk) { + this.gfx.endDrawing(); + InternalRenderTask.#canvasInUse.delete(this._canvas); + this.callback(); + } + } + } +} +const version = "5.4.296"; +const build = "f56dc8601"; + +;// ./src/display/editor/color_picker.js + + + +class ColorPicker { + #button = null; + #buttonSwatch = null; + #defaultColor; + #dropdown = null; + #dropdownWasFromKeyboard = false; + #isMainColorPicker = false; + #editor = null; + #eventBus; + #openDropdownAC = null; + #uiManager = null; + static #l10nColor = null; + static get _keyboardManager() { + return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], ColorPicker.prototype._moveToEnd]])); + } + constructor({ + editor = null, + uiManager = null + }) { + if (editor) { + this.#isMainColorPicker = false; + this.#editor = editor; + } else { + this.#isMainColorPicker = true; + } + this.#uiManager = editor?._uiManager || uiManager; + this.#eventBus = this.#uiManager._eventBus; + this.#defaultColor = editor?.color?.toUpperCase() || this.#uiManager?.highlightColors.values().next().value || "#FFFF98"; + ColorPicker.#l10nColor ||= Object.freeze({ + blue: "pdfjs-editor-colorpicker-blue", + green: "pdfjs-editor-colorpicker-green", + pink: "pdfjs-editor-colorpicker-pink", + red: "pdfjs-editor-colorpicker-red", + yellow: "pdfjs-editor-colorpicker-yellow" + }); + } + renderButton() { + const button = this.#button = document.createElement("button"); + button.className = "colorPicker"; + button.tabIndex = "0"; + button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button"); + button.ariaHasPopup = "true"; + if (this.#editor) { + button.ariaControls = `${this.#editor.id}_colorpicker_dropdown`; + } + const signal = this.#uiManager._signal; + button.addEventListener("click", this.#openDropdown.bind(this), { + signal + }); + button.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + const swatch = this.#buttonSwatch = document.createElement("span"); + swatch.className = "swatch"; + swatch.ariaHidden = "true"; + swatch.style.backgroundColor = this.#defaultColor; + button.append(swatch); + return button; + } + renderMainDropdown() { + const dropdown = this.#dropdown = this.#getDropdownRoot(); + dropdown.ariaOrientation = "horizontal"; + dropdown.ariaLabelledBy = "highlightColorPickerLabel"; + return dropdown; + } + #getDropdownRoot() { + const div = document.createElement("div"); + const signal = this.#uiManager._signal; + div.addEventListener("contextmenu", noContextMenu, { + signal + }); + div.className = "dropdown"; + div.role = "listbox"; + div.ariaMultiSelectable = "false"; + div.ariaOrientation = "vertical"; + div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown"); + if (this.#editor) { + div.id = `${this.#editor.id}_colorpicker_dropdown`; + } + for (const [name, color] of this.#uiManager.highlightColors) { + const button = document.createElement("button"); + button.tabIndex = "0"; + button.role = "option"; + button.setAttribute("data-color", color); + button.title = name; + button.setAttribute("data-l10n-id", ColorPicker.#l10nColor[name]); + const swatch = document.createElement("span"); + button.append(swatch); + swatch.className = "swatch"; + swatch.style.backgroundColor = color; + button.ariaSelected = color === this.#defaultColor; + button.addEventListener("click", this.#colorSelect.bind(this, color), { + signal + }); + div.append(button); + } + div.addEventListener("keydown", this.#keyDown.bind(this), { + signal + }); + return div; + } + #colorSelect(color, event) { + event.stopPropagation(); + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + value: color + }); + this.updateColor(color); + } + _colorSelectFromKeyboard(event) { + if (event.target === this.#button) { + this.#openDropdown(event); + return; + } + const color = event.target.getAttribute("data-color"); + if (!color) { + return; + } + this.#colorSelect(color, event); + } + _moveToNext(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + if (event.target === this.#button) { + this.#dropdown.firstChild?.focus(); + return; + } + event.target.nextSibling?.focus(); + } + _moveToPrevious(event) { + if (event.target === this.#dropdown?.firstChild || event.target === this.#button) { + if (this.#isDropdownVisible) { + this._hideDropdownFromKeyboard(); + } + return; + } + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + } + event.target.previousSibling?.focus(); + } + _moveToBeginning(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.firstChild?.focus(); + } + _moveToEnd(event) { + if (!this.#isDropdownVisible) { + this.#openDropdown(event); + return; + } + this.#dropdown.lastChild?.focus(); + } + #keyDown(event) { + ColorPicker._keyboardManager.exec(this, event); + } + #openDropdown(event) { + if (this.#isDropdownVisible) { + this.hideDropdown(); + return; + } + this.#dropdownWasFromKeyboard = event.detail === 0; + if (!this.#openDropdownAC) { + this.#openDropdownAC = new AbortController(); + window.addEventListener("pointerdown", this.#pointerDown.bind(this), { + signal: this.#uiManager.combinedSignal(this.#openDropdownAC) + }); + } + this.#button.ariaExpanded = "true"; + if (this.#dropdown) { + this.#dropdown.classList.remove("hidden"); + return; + } + const root = this.#dropdown = this.#getDropdownRoot(); + this.#button.append(root); + } + #pointerDown(event) { + if (this.#dropdown?.contains(event.target)) { + return; + } + this.hideDropdown(); + } + hideDropdown() { + this.#dropdown?.classList.add("hidden"); + this.#button.ariaExpanded = "false"; + this.#openDropdownAC?.abort(); + this.#openDropdownAC = null; + } + get #isDropdownVisible() { + return this.#dropdown && !this.#dropdown.classList.contains("hidden"); + } + _hideDropdownFromKeyboard() { + if (this.#isMainColorPicker) { + return; + } + if (!this.#isDropdownVisible) { + this.#editor?.unselect(); + return; + } + this.hideDropdown(); + this.#button.focus({ + preventScroll: true, + focusVisible: this.#dropdownWasFromKeyboard + }); + } + updateColor(color) { + if (this.#buttonSwatch) { + this.#buttonSwatch.style.backgroundColor = color; + } + if (!this.#dropdown) { + return; + } + const i = this.#uiManager.highlightColors.values(); + for (const child of this.#dropdown.children) { + child.ariaSelected = i.next().value === color.toUpperCase(); + } + } + destroy() { + this.#button?.remove(); + this.#button = null; + this.#buttonSwatch = null; + this.#dropdown?.remove(); + this.#dropdown = null; + } +} +class BasicColorPicker { + #input = null; + #editor = null; + #uiManager = null; + static #l10nColor = null; + constructor(editor) { + this.#editor = editor; + this.#uiManager = editor._uiManager; + BasicColorPicker.#l10nColor ||= Object.freeze({ + freetext: "pdfjs-editor-color-picker-free-text-input", + ink: "pdfjs-editor-color-picker-ink-input" + }); + } + renderButton() { + if (this.#input) { + return this.#input; + } + const { + editorType, + colorType, + colorValue + } = this.#editor; + const input = this.#input = document.createElement("input"); + input.type = "color"; + input.value = colorValue || "#000000"; + input.className = "basicColorPicker"; + input.tabIndex = 0; + input.setAttribute("data-l10n-id", BasicColorPicker.#l10nColor[editorType]); + input.addEventListener("input", () => { + this.#uiManager.updateParams(colorType, input.value); + }, { + signal: this.#uiManager._signal + }); + return input; + } + update(value) { + if (!this.#input) { + return; + } + this.#input.value = value; + } + destroy() { + this.#input?.remove(); + this.#input = null; + } + hideDropdown() {} +} + +;// ./src/shared/scripting_utils.js +function makeColorComp(n) { + return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0"); +} +function scaleAndClamp(x) { + return Math.max(0, Math.min(255, 255 * x)); +} +class ColorConverters { + static CMYK_G([c, y, m, k]) { + return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)]; + } + static G_CMYK([g]) { + return ["CMYK", 0, 0, 0, 1 - g]; + } + static G_RGB([g]) { + return ["RGB", g, g, g]; + } + static G_rgb([g]) { + g = scaleAndClamp(g); + return [g, g, g]; + } + static G_HTML([g]) { + const G = makeColorComp(g); + return `#${G}${G}${G}`; + } + static RGB_G([r, g, b]) { + return ["G", 0.3 * r + 0.59 * g + 0.11 * b]; + } + static RGB_rgb(color) { + return color.map(scaleAndClamp); + } + static RGB_HTML(color) { + return `#${color.map(makeColorComp).join("")}`; + } + static T_HTML() { + return "#00000000"; + } + static T_rgb() { + return [null]; + } + static CMYK_RGB([c, y, m, k]) { + return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)]; + } + static CMYK_rgb([c, y, m, k]) { + return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))]; + } + static CMYK_HTML(components) { + const rgb = this.CMYK_RGB(components).slice(1); + return this.RGB_HTML(rgb); + } + static RGB_CMYK([r, g, b]) { + const c = 1 - r; + const m = 1 - g; + const y = 1 - b; + const k = Math.min(c, m, y); + return ["CMYK", c, m, y, k]; + } +} +const DateFormats = (/* unused pure expression or super */ null && (["m/d", "m/d/yy", "mm/dd/yy", "mm/yy", "d-mmm", "d-mmm-yy", "dd-mmm-yy", "yy-mm-dd", "mmm-yy", "mmmm-yy", "mmm d, yyyy", "mmmm d, yyyy", "m/d/yy h:MM tt", "m/d/yy HH:MM"])); +const TimeFormats = (/* unused pure expression or super */ null && (["HH:MM", "h:MM tt", "HH:MM:ss", "h:MM:ss tt"])); + +;// ./src/display/svg_factory.js + + +class 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) { + unreachable("Abstract method `_createSVG` called."); + } +} +class DOMSVGFactory extends BaseSVGFactory { + _createSVG(type) { + return document.createElementNS(SVG_NS, type); + } +} + +;// ./src/display/annotation_layer.js + + + + + +const annotation_layer_DEFAULT_FONT_SIZE = 9; +const GetElementsByNameSet = new WeakSet(); +const TIMEZONE_OFFSET = new Date().getTimezoneOffset() * 60 * 1000; +class AnnotationElementFactory { + static create(parameters) { + const subtype = parameters.data.annotationType; + switch (subtype) { + case AnnotationType.LINK: + return new LinkAnnotationElement(parameters); + case AnnotationType.TEXT: + return new TextAnnotationElement(parameters); + case 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); + case "Sig": + return new SignatureWidgetAnnotationElement(parameters); + } + return new WidgetAnnotationElement(parameters); + case AnnotationType.POPUP: + return new PopupAnnotationElement(parameters); + case AnnotationType.FREETEXT: + return new FreeTextAnnotationElement(parameters); + case AnnotationType.LINE: + return new LineAnnotationElement(parameters); + case AnnotationType.SQUARE: + return new SquareAnnotationElement(parameters); + case AnnotationType.CIRCLE: + return new CircleAnnotationElement(parameters); + case AnnotationType.POLYLINE: + return new PolylineAnnotationElement(parameters); + case AnnotationType.CARET: + return new CaretAnnotationElement(parameters); + case AnnotationType.INK: + return new InkAnnotationElement(parameters); + case AnnotationType.POLYGON: + return new PolygonAnnotationElement(parameters); + case AnnotationType.HIGHLIGHT: + return new HighlightAnnotationElement(parameters); + case AnnotationType.UNDERLINE: + return new UnderlineAnnotationElement(parameters); + case AnnotationType.SQUIGGLY: + return new SquigglyAnnotationElement(parameters); + case AnnotationType.STRIKEOUT: + return new StrikeOutAnnotationElement(parameters); + case AnnotationType.STAMP: + return new StampAnnotationElement(parameters); + case AnnotationType.FILEATTACHMENT: + return new FileAttachmentAnnotationElement(parameters); + default: + return new AnnotationElement(parameters); + } + } +} +class AnnotationElement { + #updates = null; + #hasBorder = false; + #popupElement = null; + constructor(parameters, { + isRenderable = false, + ignoreBorder = false, + createQuadrilaterals = false + } = {}) { + this.isRenderable = isRenderable; + this.data = parameters.data; + this.layer = parameters.layer; + 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.enableComment = parameters.enableComment; + this.enableScripting = parameters.enableScripting; + this.hasJSActions = parameters.hasJSActions; + this._fieldObjects = parameters.fieldObjects; + this.parent = parameters.parent; + if (isRenderable) { + this.container = this._createContainer(ignoreBorder); + } + if (createQuadrilaterals) { + this._createQuadrilaterals(); + } + } + static _hasPopupData({ + contentsObj, + richText + }) { + return !!(contentsObj?.str || richText?.str); + } + get _isEditable() { + return this.data.isEditable; + } + get hasPopupData() { + return AnnotationElement._hasPopupData(this.data) || this.enableComment && !!this.commentText; + } + get commentData() { + const { + data + } = this; + const editor = this.annotationStorage?.getEditor(data.id); + if (editor) { + return editor.getData(); + } + return data; + } + get hasCommentButton() { + return this.enableComment && this.hasPopupElement; + } + get commentButtonPosition() { + const editor = this.annotationStorage?.getEditor(this.data.id); + if (editor) { + return editor.commentButtonPositionInPage; + } + const { + quadPoints, + inkLists, + rect + } = this.data; + let maxX = -Infinity; + let maxY = -Infinity; + if (quadPoints?.length >= 8) { + for (let i = 0; i < quadPoints.length; i += 8) { + if (quadPoints[i + 1] > maxY) { + maxY = quadPoints[i + 1]; + maxX = quadPoints[i + 2]; + } else if (quadPoints[i + 1] === maxY) { + maxX = Math.max(maxX, quadPoints[i + 2]); + } + } + return [maxX, maxY]; + } + if (inkLists?.length >= 1) { + for (const inkList of inkLists) { + for (let i = 0, ii = inkList.length; i < ii; i += 2) { + if (inkList[i + 1] > maxY) { + maxY = inkList[i + 1]; + maxX = inkList[i]; + } else if (inkList[i + 1] === maxY) { + maxX = Math.max(maxX, inkList[i]); + } + } + } + if (maxX !== Infinity) { + return [maxX, maxY]; + } + } + if (rect) { + return [rect[2], rect[3]]; + } + return null; + } + _normalizePoint(point) { + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.parent; + point[1] = view[3] - point[1] + view[1]; + point[0] = 100 * (point[0] - pageX) / pageWidth; + point[1] = 100 * (point[1] - pageY) / pageHeight; + return point; + } + get commentText() { + const { + data + } = this; + return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || ""; + } + set commentText(text) { + const { + data + } = this; + const popup = { + deleted: !text, + contents: text || "" + }; + if (!this.annotationStorage.updateEditor(data.id, { + popup + })) { + this.annotationStorage.setValue(`${AnnotationEditorPrefix}${data.id}`, { + id: data.id, + annotationType: data.annotationType, + pageIndex: this.parent.page._pageIndex, + popup, + popupRef: data.popupRef, + modificationDate: new Date() + }); + } + if (!text) { + this.removePopup(); + } + } + removePopup() { + (this.#popupElement?.popup || this.popup)?.remove(); + this.#popupElement = this.popup = null; + } + updateEdited(params) { + if (!this.container) { + return; + } + if (params.rect) { + this.#updates ||= { + rect: this.data.rect.slice(0) + }; + } + const { + rect, + popup: newPopup + } = params; + if (rect) { + this.#setRectEdited(rect); + } + let popup = this.#popupElement?.popup || this.popup; + if (!popup && newPopup?.text) { + this._createPopup(newPopup); + popup = this.#popupElement.popup; + } + if (!popup) { + return; + } + popup.updateEdited(params); + if (newPopup?.deleted) { + popup.remove(); + this.#popupElement = null; + this.popup = null; + } + } + resetEdited() { + if (!this.#updates) { + return; + } + this.#setRectEdited(this.#updates.rect); + this.#popupElement?.popup.resetEdited(); + this.#updates = null; + } + #setRectEdited(rect) { + const { + container: { + style + }, + data: { + rect: currentRect, + rotation + }, + parent: { + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } + } = this; + currentRect?.splice(0, 4, ...rect); + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`; + if (rotation === 0) { + style.width = `${100 * (rect[2] - rect[0]) / pageWidth}%`; + style.height = `${100 * (rect[3] - rect[1]) / pageHeight}%`; + } else { + this.setRotation(rotation); + } + } + _createContainer(ignoreBorder) { + const { + data, + parent: { + page, + viewport + } + } = this; + const container = document.createElement("section"); + container.setAttribute("data-annotation-id", data.id); + if (!(this instanceof WidgetAnnotationElement) && !(this instanceof LinkAnnotationElement)) { + container.tabIndex = 0; + } + const { + style + } = container; + style.zIndex = this.parent.zIndex; + this.parent.zIndex += 2; + if (data.alternativeText) { + container.title = data.alternativeText; + } + if (data.noRotate) { + container.classList.add("norotate"); + } + if (!data.rect || this instanceof PopupAnnotationElement) { + const { + rotation + } = data; + if (!data.hasOwnCanvas && rotation !== 0) { + this.setRotation(rotation, container); + } + return container; + } + const { + width, + height + } = this; + if (!ignoreBorder && data.borderStyle.width > 0) { + 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(--total-scale-factor)) / calc(${verticalRadius}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } else if (this instanceof RadioButtonWidgetAnnotationElement) { + const radius = `calc(${width}px * var(--total-scale-factor)) / calc(${height}px * var(--total-scale-factor))`; + style.borderRadius = radius; + } + switch (data.borderStyle.style) { + case AnnotationBorderStyleType.SOLID: + style.borderStyle = "solid"; + break; + case AnnotationBorderStyleType.DASHED: + style.borderStyle = "dashed"; + break; + case AnnotationBorderStyleType.BEVELED: + warn("Unimplemented border style: beveled"); + break; + case AnnotationBorderStyleType.INSET: + warn("Unimplemented border style: inset"); + break; + case AnnotationBorderStyleType.UNDERLINE: + style.borderBottomStyle = "solid"; + break; + default: + break; + } + const borderColor = data.borderColor || null; + if (borderColor) { + this.#hasBorder = true; + style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0); + } else { + style.borderWidth = 0; + } + } + const rect = 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]]); + const { + pageWidth, + pageHeight, + pageX, + pageY + } = viewport.rawDims; + style.left = `${100 * (rect[0] - pageX) / pageWidth}%`; + style.top = `${100 * (rect[1] - pageY) / pageHeight}%`; + const { + rotation + } = data; + if (data.hasOwnCanvas || rotation === 0) { + style.width = `${100 * width / pageWidth}%`; + style.height = `${100 * height / pageHeight}%`; + } else { + this.setRotation(rotation, container); + } + return container; + } + setRotation(angle, container = this.container) { + if (!this.data.rect) { + return; + } + const { + pageWidth, + pageHeight + } = this.parent.viewport.rawDims; + let { + width, + height + } = this; + if (angle % 180 !== 0) { + [width, height] = [height, width]; + } + container.style.width = `${100 * width / pageWidth}%`; + container.style.height = `${100 * height / pageHeight}%`; + container.setAttribute("data-main-rotation", (360 - angle) % 360); + } + get _commonActions() { + const setColor = (jsName, styleName, event) => { + const color = event.detail[jsName]; + const colorType = color[0]; + const colorArray = color.slice(1); + event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray); + this.annotationStorage.setValue(this.data.id, { + [styleName]: ColorConverters[`${colorType}_rgb`](colorArray) + }); + }; + return shadow(this, "_commonActions", { + display: event => { + const { + display + } = event.detail; + const hidden = display % 2 === 1; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noView: hidden, + noPrint: display === 1 || display === 2 + }); + }, + print: event => { + this.annotationStorage.setValue(this.data.id, { + noPrint: !event.detail.print + }); + }, + hidden: event => { + const { + hidden + } = event.detail; + this.container.style.visibility = hidden ? "hidden" : "visible"; + this.annotationStorage.setValue(this.data.id, { + noPrint: hidden, + noView: hidden + }); + }, + focus: event => { + setTimeout(() => event.target.focus({ + preventScroll: false + }), 0); + }, + userName: event => { + event.target.title = event.detail.userName; + }, + readonly: event => { + event.target.disabled = event.detail.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() { + if (!this.container) { + return; + } + const { + quadPoints + } = this.data; + if (!quadPoints) { + return; + } + const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map(x => Math.fround(x)); + if (quadPoints.length === 8) { + const [trX, trY, blX, blY] = quadPoints.subarray(2, 6); + if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) { + return; + } + } + const { + style + } = this.container; + let svgBuffer; + if (this.#hasBorder) { + const { + borderColor, + borderWidth + } = style; + style.borderWidth = 0; + svgBuffer = ["url('data:image/svg+xml;utf8,", ``, ``]; + this.container.classList.add("hasBorder"); + } + const width = rectTrX - rectBlX; + const height = rectTrY - rectBlY; + const { + svgFactory + } = this; + const svg = svgFactory.createElement("svg"); + svg.classList.add("quadrilateralsContainer"); + svg.setAttribute("width", 0); + svg.setAttribute("height", 0); + svg.role = "none"; + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const clipPath = svgFactory.createElement("clipPath"); + const id = `clippath_${this.data.id}`; + clipPath.setAttribute("id", id); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + defs.append(clipPath); + for (let i = 2, ii = quadPoints.length; i < ii; i += 8) { + const trX = quadPoints[i]; + const trY = quadPoints[i + 1]; + const blX = quadPoints[i + 2]; + const blY = quadPoints[i + 3]; + const rect = svgFactory.createElement("rect"); + const x = (blX - rectBlX) / width; + const y = (rectTrY - trY) / height; + const rectWidth = (trX - blX) / width; + const rectHeight = (trY - blY) / height; + rect.setAttribute("x", x); + rect.setAttribute("y", y); + rect.setAttribute("width", rectWidth); + rect.setAttribute("height", rectHeight); + clipPath.append(rect); + svgBuffer?.push(``); + } + if (this.#hasBorder) { + svgBuffer.push(`')`); + style.backgroundImage = svgBuffer.join(""); + } + this.container.append(svg); + this.container.style.clipPath = `url(#${id})`; + } + _createPopup(popupData = null) { + const { + data + } = this; + let contentsObj, modificationDate; + if (popupData) { + contentsObj = { + str: popupData.text + }; + modificationDate = popupData.date; + } else { + contentsObj = data.contentsObj; + modificationDate = data.modificationDate; + } + const popup = this.#popupElement = new PopupAnnotationElement({ + data: { + color: data.color, + titleObj: data.titleObj, + modificationDate, + contentsObj, + richText: data.richText, + parentRect: data.rect, + borderStyle: 0, + id: `popup_${data.id}`, + rotation: data.rotation, + noRotate: true + }, + linkService: this.linkService, + parent: this.parent, + elements: [this] + }); + if (!this.parent._commentManager) { + this.parent.div.append(popup.render()); + } + } + get hasPopupElement() { + return !!(this.#popupElement || this.popup || this.data.popupRef); + } + get extraPopupElement() { + return this.#popupElement; + } + render() { + 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)) { + 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; + } + show() { + if (this.container) { + this.container.hidden = false; + } + this.popup?.maybeShow(); + } + hide() { + if (this.container) { + this.container.hidden = true; + } + this.popup?.forceHide(); + } + getElementsToTriggerPopup() { + return this.container; + } + addHighlightArea() { + const triggers = this.getElementsToTriggerPopup(); + if (Array.isArray(triggers)) { + for (const element of triggers) { + element.classList.add("highlightArea"); + } + } else { + triggers.classList.add("highlightArea"); + } + } + _editOnDoubleClick() { + if (!this._isEditable) { + return; + } + const { + annotationEditorType: mode, + data: { + id: editId + } + } = this; + this.container.addEventListener("dblclick", () => { + this.linkService.eventBus?.dispatch("switchannotationeditormode", { + source: this, + mode, + editId, + mustEnterInEditMode: true + }); + }); + } + get width() { + return this.data.rect[2] - this.data.rect[0]; + } + get height() { + return this.data.rect[3] - this.data.rect[1]; + } +} +class EditorAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.editor = parameters.editor; + } + render() { + this.container.className = "editorAnnotation"; + return this.container; + } + createOrUpdatePopup() { + const { + editor + } = this; + if (!editor.hasComment) { + return; + } + this._createPopup(editor.comment); + this.extraPopupElement.popup.renderCommentButton(); + } + get hasCommentButton() { + return this.enableComment && this.editor.hasComment; + } + get commentButtonPosition() { + return this.editor.commentButtonPositionInPage; + } + get commentText() { + return this.editor.comment.text; + } + set commentText(text) { + this.editor.comment = text; + if (!text) { + this.removePopup(); + } + } + get commentData() { + return this.editor.getData(); + } + remove() { + this.container.remove(); + this.container = null; + this.removePopup(); + } +} +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, data.overlaidText); + isBound = true; + } else if (data.attachment) { + this.#bindAttachment(link, data.attachment, data.overlaidText, data.attachmentDest); + isBound = true; + } else if (data.setOCGState) { + this.#bindSetOCGState(link, data.setOCGState, data.overlaidText); + isBound = true; + } else if (data.dest) { + this._bindLink(link, data.dest, data.overlaidText); + 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; + } + } + this.container.classList.add("linkAnnotation"); + if (isBound) { + this.container.append(link); + } + return this.container; + } + #setInternalLink() { + this.container.setAttribute("data-internal-link", ""); + } + _bindLink(link, destination, overlaidText = "") { + link.href = this.linkService.getDestinationHash(destination); + link.onclick = () => { + if (destination) { + this.linkService.goToDestination(destination); + } + return false; + }; + if (destination || destination === "") { + this.#setInternalLink(); + } + if (overlaidText) { + link.title = overlaidText; + } + } + _bindNamedAction(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeNamedAction(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + this.#setInternalLink(); + } + #bindAttachment(link, attachment, overlaidText = "", dest = null) { + link.href = this.linkService.getAnchorUrl(""); + if (attachment.description) { + link.title = attachment.description; + } else if (overlaidText) { + link.title = overlaidText; + } + link.onclick = () => { + this.downloadManager?.openOrDownloadData(attachment.content, attachment.filename, dest); + return false; + }; + this.#setInternalLink(); + } + #bindSetOCGState(link, action, overlaidText = "") { + link.href = this.linkService.getAnchorUrl(""); + link.onclick = () => { + this.linkService.executeSetOCGState(action); + return false; + }; + if (overlaidText) { + link.title = overlaidText; + } + 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 (data.overlaidText) { + link.title = data.overlaidText; + } + 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) { + 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)) { + 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) { + super(parameters, { + isRenderable: true + }); + } + render() { + this.container.classList.add("textAnnotation"); + const image = document.createElement("img"); + image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg"; + image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type"); + image.setAttribute("data-l10n-args", JSON.stringify({ + type: this.data.name + })); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(image); + return this.container; + } +} +class WidgetAnnotationElement extends AnnotationElement { + render() { + return this.container; + } + showElementAndHideCanvas(element) { + if (this.data.hasOwnCanvas) { + if (element.previousSibling?.nodeName === "CANVAS") { + element.previousSibling.hidden = true; + } + element.hidden = false; + } + } + _getKeyModifier(event) { + return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey; + } + _setEventListener(element, elementData, 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 => { + if (baseName === "blur") { + if (!elementData.focused || !event.relatedTarget) { + return; + } + elementData.focused = false; + } else if (baseName === "focus") { + if (elementData.focused) { + return; + } + elementData.focused = true; + } + if (!valueGetter) { + return; + } + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id: this.data.id, + name: eventName, + value: valueGetter(event) + } + }); + }); + } + } + _setEventListeners(element, elementData, names, getter) { + for (const [baseName, eventName] of names) { + if (eventName === "Action" || this.data.actions?.[eventName]) { + if (eventName === "Focus" || eventName === "Blur") { + elementData ||= { + focused: false + }; + } + this._setEventListener(element, elementData, baseName, eventName, getter); + if (eventName === "Focus" && !this.data.actions?.Blur) { + this._setEventListener(element, elementData, "blur", "Blur", null); + } else if (eventName === "Blur" && !this.data.actions?.Focus) { + this._setEventListener(element, elementData, "focus", "Focus", null); + } + } + } + } + _setBackgroundColor(element) { + const color = this.data.backgroundColor || null; + element.style.backgroundColor = color === null ? "transparent" : 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 || annotation_layer_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 / (LINE_FACTOR * fontSize)) || 1; + const lineHeight = height / numberOfLines; + computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR)); + } else { + const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE); + computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR)); + } + style.fontSize = `calc(${computedFontSize}px * var(--total-scale-factor))`; + style.color = 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.hasOwnCanvas || !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.classList.add("textWidgetAnnotation"); + let element = null; + if (this.renderForms) { + const storedData = storage.getValue(id, { + value: this.data.fieldValue + }); + let textContent = storedData.value || ""; + const maxLen = storage.getValue(id, { + charLimit: this.data.maxLen + }).charLimit; + if (maxLen && textContent.length > maxLen) { + textContent = textContent.slice(0, maxLen); + } + let fieldFormattedValues = storedData.formattedValue || this.data.textContent?.join("\n") || null; + if (fieldFormattedValues && this.data.comb) { + fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, ""); + } + const elementData = { + userValue: textContent, + formattedValue: fieldFormattedValues, + lastCommittedValue: null, + commitKey: 1, + focused: false + }; + if (this.data.multiLine) { + element = document.createElement("textarea"); + element.textContent = fieldFormattedValues ?? textContent; + if (this.data.doNotScroll) { + element.style.overflowY = "hidden"; + } + } else { + element = document.createElement("input"); + element.type = this.data.password ? "password" : "text"; + element.setAttribute("value", fieldFormattedValues ?? textContent); + if (this.data.doNotScroll) { + element.style.overflowX = "hidden"; + } + } + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + GetElementsByNameSet.add(element); + element.setAttribute("data-element-id", id); + element.disabled = this.data.readOnly; + element.name = this.data.fieldName; + element.tabIndex = 0; + const { + datetimeFormat, + datetimeType, + timeStep + } = this.data; + const hasDateOrTime = !!datetimeType && this.enableScripting; + if (datetimeFormat) { + element.title = datetimeFormat; + } + 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"); + elementData.formattedValue = null; + }); + 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 => { + if (elementData.focused) { + return; + } + const { + target + } = event; + if (hasDateOrTime) { + target.type = datetimeType; + if (timeStep) { + target.step = timeStep; + } + } + if (elementData.userValue) { + const value = elementData.userValue; + if (hasDateOrTime) { + if (datetimeType === "time") { + const date = new Date(value); + const parts = [date.getHours(), date.getMinutes(), date.getSeconds()]; + target.value = parts.map(v => v.toString().padStart(2, "0")).join(":"); + } else { + target.value = new Date(value - TIMEZONE_OFFSET).toISOString().split(datetimeType === "date" ? "T" : ".", 1)[0]; + } + } else { + target.value = value; + } + } + elementData.lastCommittedValue = target.value; + elementData.commitKey = 1; + if (!this.data.actions?.Focus) { + elementData.focused = true; + } + }); + element.addEventListener("updatefromsandbox", jsEvent => { + this.showElementAndHideCanvas(jsEvent.target); + const actions = { + value(event) { + elementData.userValue = event.detail.value ?? ""; + if (!hasDateOrTime) { + 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; + } + const data = { + formattedValue + }; + if (hasDateOrTime) { + data.value = formattedValue; + } + storage.setValue(id, data); + }, + 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 (!elementData.focused || !event.relatedTarget) { + return; + } + if (!this.data.actions?.Blur) { + elementData.focused = false; + } + const { + target + } = event; + let { + value + } = target; + if (hasDateOrTime) { + if (value && datetimeType === "time") { + const parts = value.split(":").map(v => parseInt(v, 10)); + value = new Date(2000, 0, 1, parts[0], parts[1], parts[2] || 0).valueOf(); + target.step = ""; + } else { + if (!value.includes("T")) { + value = `${value}T00:00`; + } + value = new Date(value).valueOf(); + } + target.type = "text"; + } + 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, elementData, [["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(--total-scale-factor) - 1ch)`; + } + } else { + element = document.createElement("div"); + element.textContent = this.data.fieldValue; + element.style.verticalAlign = "middle"; + element.style.display = "table-cell"; + if (this.data.hasOwnCanvas) { + element.hidden = true; + } + } + this._setTextStyle(element); + this._setBackgroundColor(element); + this._setDefaultPropertiesFromJS(element); + this.container.append(element); + return this.container; + } +} +class SignatureWidgetAnnotationElement extends WidgetAnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: !!parameters.data.hasOwnCanvas + }); + } +} +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.classList.add("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 = 0; + 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, null, [["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.classList.add("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 + }); + } + if (value) { + for (const radio of this._getElementsByName(data.fieldName, id)) { + storage.setValue(radio.id, { + value: false + }); + } + } + 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 = 0; + 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, null, [["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.classList.add("buttonWidgetAnnotation", "pushButton"); + 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.classList.add("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 = 0; + 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 => ({ + 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); + const change = getValue(false); + storage.setValue(id, { + value: exportValue + }); + event.preventDefault(); + this.linkService.eventBus?.dispatch("dispatcheventinsandbox", { + source: this, + detail: { + id, + name: "Keystroke", + value: selectedValues, + change, + changeEx: exportValue, + willCommit: false, + commitKey: 1, + keyDown: false + } + }); + }); + this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], event => event.target.value); + } 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 { + constructor(parameters) { + const { + data, + elements, + parent + } = parameters; + const hasCommentManager = !!parent._commentManager; + super(parameters, { + isRenderable: !hasCommentManager && AnnotationElement._hasPopupData(data) + }); + this.elements = elements; + if (hasCommentManager && AnnotationElement._hasPopupData(data)) { + const popup = this.popup = this.#createPopup(); + for (const element of elements) { + element.popup = popup; + } + } else { + this.popup = null; + } + } + #createPopup() { + return new PopupElement({ + container: this.container, + color: this.data.color, + titleObj: this.data.titleObj, + modificationDate: this.data.modificationDate || this.data.creationDate, + contentsObj: this.data.contentsObj, + richText: this.data.richText, + rect: this.data.rect, + parentRect: this.data.parentRect || null, + parent: this.parent, + elements: this.elements, + open: this.data.open, + commentManager: this.parent._commentManager + }); + } + render() { + const { + container + } = this; + container.classList.add("popupAnnotation"); + container.role = "comment"; + const popup = this.popup = this.#createPopup(); + const elementIds = []; + for (const element of this.elements) { + element.popup = popup; + element.container.ariaHasPopup = "dialog"; + elementIds.push(element.data.id); + element.addHighlightArea(); + } + this.container.setAttribute("aria-controls", elementIds.map(id => `${AnnotationPrefix}${id}`).join(",")); + return this.container; + } +} +class PopupElement { + #commentManager = null; + #boundKeyDown = this.#keyDown.bind(this); + #boundHide = this.#hide.bind(this); + #boundShow = this.#show.bind(this); + #boundToggle = this.#toggle.bind(this); + #color = null; + #container = null; + #contentsObj = null; + #dateObj = null; + #elements = null; + #parent = null; + #parentRect = null; + #pinned = false; + #popup = null; + #popupAbortController = null; + #position = null; + #commentButton = null; + #commentButtonPosition = null; + #popupPosition = null; + #rect = null; + #richText = null; + #titleObj = null; + #updates = null; + #wasVisible = false; + #firstElement = null; + #commentText = null; + constructor({ + container, + color, + elements, + titleObj, + modificationDate, + contentsObj, + richText, + parent, + rect, + parentRect, + open, + commentManager = null + }) { + this.#container = container; + this.#titleObj = titleObj; + this.#contentsObj = contentsObj; + this.#richText = richText; + this.#parent = parent; + this.#color = color; + this.#rect = rect; + this.#parentRect = parentRect; + this.#elements = elements; + this.#commentManager = commentManager; + this.#firstElement = elements[0]; + this.#dateObj = PDFDateString.toDateObject(modificationDate); + this.trigger = elements.flatMap(e => e.getElementsToTriggerPopup()); + if (commentManager) { + this.renderCommentButton(); + } else { + this.#addEventListeners(); + this.#container.hidden = true; + if (open) { + this.#toggle(); + } + } + } + #addEventListeners() { + if (this.#popupAbortController) { + return; + } + this.#popupAbortController = new AbortController(); + const { + signal + } = this.#popupAbortController; + for (const element of this.trigger) { + element.addEventListener("click", this.#boundToggle, { + signal + }); + element.addEventListener("pointerenter", this.#boundShow, { + signal + }); + element.addEventListener("pointerleave", this.#boundHide, { + signal + }); + element.classList.add("popupTriggerArea"); + } + for (const element of this.#elements) { + element.container?.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + } + } + #setCommentButtonPosition() { + const element = this.#elements.find(e => e.hasCommentButton); + if (!element) { + return; + } + this.#commentButtonPosition = element._normalizePoint(element.commentButtonPosition); + } + renderCommentButton() { + if (this.#commentButton) { + return; + } + if (!this.#commentButtonPosition) { + this.#setCommentButtonPosition(); + } + if (!this.#commentButtonPosition) { + return; + } + const { + signal + } = this.#popupAbortController = new AbortController(); + const hasOwnButton = !!this.#firstElement.extraPopupElement; + const togglePopup = () => { + this.#commentManager.toggleCommentPopup(this, true, undefined, !hasOwnButton); + }; + const showPopup = () => { + this.#commentManager.toggleCommentPopup(this, false, true, !hasOwnButton); + }; + const hidePopup = () => { + this.#commentManager.toggleCommentPopup(this, false, false); + }; + if (!hasOwnButton) { + const button = this.#commentButton = document.createElement("button"); + button.className = "annotationCommentButton"; + const parentContainer = this.#firstElement.container; + button.style.zIndex = parentContainer.style.zIndex + 1; + button.tabIndex = 0; + button.ariaHasPopup = "dialog"; + button.ariaControls = "commentPopup"; + button.setAttribute("data-l10n-id", "pdfjs-show-comment-button"); + this.#updateColor(); + this.#updateCommentButtonPosition(); + button.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + button.addEventListener("click", togglePopup, { + signal + }); + button.addEventListener("pointerenter", showPopup, { + signal + }); + button.addEventListener("pointerleave", hidePopup, { + signal + }); + parentContainer.after(button); + } else { + this.#commentButton = this.#firstElement.container; + for (const element of this.trigger) { + element.ariaHasPopup = "dialog"; + element.ariaControls = "commentPopup"; + element.addEventListener("keydown", this.#boundKeyDown, { + signal + }); + element.addEventListener("click", togglePopup, { + signal + }); + element.addEventListener("pointerenter", showPopup, { + signal + }); + element.addEventListener("pointerleave", hidePopup, { + signal + }); + element.classList.add("popupTriggerArea"); + } + } + } + #updateCommentButtonPosition() { + if (this.#firstElement.extraPopupElement && !this.#firstElement.editor) { + return; + } + this.renderCommentButton(); + const [x, y] = this.#commentButtonPosition; + const { + style + } = this.#commentButton; + style.left = `calc(${x}%)`; + style.top = `calc(${y}% - var(--comment-button-dim))`; + } + #updateColor() { + if (this.#firstElement.extraPopupElement) { + return; + } + this.renderCommentButton(); + this.#commentButton.style.backgroundColor = this.commentButtonColor || ""; + } + get commentButtonColor() { + const { + color, + opacity + } = this.#firstElement.commentData; + if (!color) { + return null; + } + return this.#parent._commentManager.makeCommentColor(color, opacity); + } + focusCommentButton() { + setTimeout(() => { + this.#commentButton?.focus(); + }, 0); + } + getData() { + const { + richText, + color, + opacity, + creationDate, + modificationDate + } = this.#firstElement.commentData; + return { + contentsObj: { + str: this.comment + }, + richText, + color, + opacity, + creationDate, + modificationDate + }; + } + get elementBeforePopup() { + return this.#commentButton; + } + get comment() { + this.#commentText ||= this.#firstElement.commentText; + return this.#commentText; + } + set comment(text) { + if (text === this.comment) { + return; + } + this.#firstElement.commentText = this.#commentText = text; + } + get parentBoundingClientRect() { + return this.#firstElement.layer.getBoundingClientRect(); + } + setCommentButtonStates({ + selected, + hasPopup + }) { + if (!this.#commentButton) { + return; + } + this.#commentButton.classList.toggle("selected", selected); + this.#commentButton.ariaExpanded = hasPopup; + } + setSelectedCommentButton(selected) { + this.#commentButton.classList.toggle("selected", selected); + } + get commentPopupPosition() { + if (this.#popupPosition) { + return this.#popupPosition; + } + const { + x, + y, + height + } = this.#commentButton.getBoundingClientRect(); + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = this.#firstElement.layer.getBoundingClientRect(); + return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight]; + } + set commentPopupPosition(pos) { + this.#popupPosition = pos; + } + hasDefaultPopupPosition() { + return this.#popupPosition === null; + } + get commentButtonPosition() { + return this.#commentButtonPosition; + } + get commentButtonWidth() { + return this.#commentButton.getBoundingClientRect().width / this.parentBoundingClientRect.width; + } + editComment(options) { + const [posX, posY] = this.#popupPosition || this.commentButtonPosition.map(x => x / 100); + const parentDimensions = this.parentBoundingClientRect; + const { + x: parentX, + y: parentY, + width: parentWidth, + height: parentHeight + } = parentDimensions; + this.#commentManager.showDialog(null, this, parentX + posX * parentWidth, parentY + posY * parentHeight, { + ...options, + parentDimensions + }); + } + render() { + if (this.#popup) { + return; + } + const popup = this.#popup = document.createElement("div"); + popup.className = "popup"; + if (this.#color) { + const baseColor = popup.style.outlineColor = Util.makeHexColor(...this.#color); + popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`; + } + const header = document.createElement("span"); + header.className = "header"; + if (this.#titleObj?.str) { + const title = document.createElement("span"); + title.className = "title"; + header.append(title); + ({ + dir: title.dir, + str: title.textContent + } = this.#titleObj); + } + popup.append(header); + if (this.#dateObj) { + const modificationDate = document.createElement("time"); + modificationDate.className = "popupDate"; + modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string"); + modificationDate.setAttribute("data-l10n-args", JSON.stringify({ + dateObj: this.#dateObj.valueOf() + })); + modificationDate.dateTime = this.#dateObj.toISOString(); + header.append(modificationDate); + } + renderRichText({ + html: this.#html || this.#contentsObj.str, + dir: this.#contentsObj?.dir, + className: "popupContent" + }, popup); + this.#container.append(popup); + } + get #html() { + const richText = this.#richText; + const contentsObj = this.#contentsObj; + if (richText?.str && (!contentsObj?.str || contentsObj.str === richText.str)) { + return this.#richText.html || null; + } + return null; + } + get #fontSize() { + return this.#html?.attributes?.style?.fontSize || 0; + } + get #fontColor() { + return this.#html?.attributes?.style?.color || null; + } + #makePopupContent(text) { + const popupLines = []; + const popupContent = { + str: text, + html: { + name: "div", + attributes: { + dir: "auto" + }, + children: [{ + name: "p", + children: popupLines + }] + } + }; + const lineAttributes = { + style: { + color: this.#fontColor, + fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : "" + } + }; + for (const line of text.split("\n")) { + popupLines.push({ + name: "span", + value: line, + attributes: lineAttributes + }); + } + return popupContent; + } + #keyDown(event) { + if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) { + return; + } + if (event.key === "Enter" || event.key === "Escape" && this.#pinned) { + this.#toggle(); + } + } + updateEdited({ + rect, + popup, + deleted + }) { + if (this.#commentManager) { + if (deleted) { + this.remove(); + this.#commentText = null; + } else if (popup) { + if (popup.deleted) { + this.remove(); + } else { + this.#updateColor(); + this.#commentText = popup.text; + } + } + if (rect) { + this.#commentButtonPosition = null; + this.#setCommentButtonPosition(); + this.#updateCommentButtonPosition(); + } + return; + } + if (deleted || popup?.deleted) { + this.remove(); + return; + } + this.#addEventListeners(); + this.#updates ||= { + contentsObj: this.#contentsObj, + richText: this.#richText + }; + if (rect) { + this.#position = null; + } + if (popup && popup.text) { + this.#richText = this.#makePopupContent(popup.text); + this.#dateObj = PDFDateString.toDateObject(popup.date); + this.#contentsObj = null; + } + this.#popup?.remove(); + this.#popup = null; + } + resetEdited() { + if (!this.#updates) { + return; + } + ({ + contentsObj: this.#contentsObj, + richText: this.#richText + } = this.#updates); + this.#updates = null; + this.#popup?.remove(); + this.#popup = null; + this.#position = null; + } + remove() { + this.#popupAbortController?.abort(); + this.#popupAbortController = null; + this.#popup?.remove(); + this.#popup = null; + this.#wasVisible = false; + this.#pinned = false; + this.#commentButton?.remove(); + this.#commentButton = null; + if (this.trigger) { + for (const element of this.trigger) { + element.classList.remove("popupTriggerArea"); + } + } + } + #setPosition() { + if (this.#position !== null) { + return; + } + const { + page: { + view + }, + viewport: { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } + } = this.#parent; + let useParentRect = !!this.#parentRect; + let rect = useParentRect ? this.#parentRect : this.#rect; + for (const element of this.#elements) { + if (!rect || Util.intersect(element.data.rect, rect) !== null) { + rect = element.data.rect; + useParentRect = true; + break; + } + } + const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]); + const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5; + const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0; + const popupLeft = normalizedRect[0] + parentWidth; + const popupTop = normalizedRect[1]; + this.#position = [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]; + const { + style + } = this.#container; + style.left = `${this.#position[0]}%`; + style.top = `${this.#position[1]}%`; + } + #toggle() { + if (this.#commentManager) { + this.#commentManager.toggleCommentPopup(this, false); + return; + } + this.#pinned = !this.#pinned; + if (this.#pinned) { + this.#show(); + this.#container.addEventListener("click", this.#boundToggle); + this.#container.addEventListener("keydown", this.#boundKeyDown); + } else { + this.#hide(); + this.#container.removeEventListener("click", this.#boundToggle); + this.#container.removeEventListener("keydown", this.#boundKeyDown); + } + } + #show() { + if (!this.#popup) { + this.render(); + } + if (!this.isVisible) { + this.#setPosition(); + this.#container.hidden = false; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) + 1000; + } else if (this.#pinned) { + this.#container.classList.add("focused"); + } + } + #hide() { + this.#container.classList.remove("focused"); + if (this.#pinned || !this.isVisible) { + return; + } + this.#container.hidden = true; + this.#container.style.zIndex = parseInt(this.#container.style.zIndex) - 1000; + } + forceHide() { + this.#wasVisible = this.isVisible; + if (!this.#wasVisible) { + return; + } + this.#container.hidden = true; + } + maybeShow() { + if (this.#commentManager) { + return; + } + this.#addEventListeners(); + if (!this.#wasVisible) { + return; + } + if (!this.#popup) { + this.#show(); + } + this.#wasVisible = false; + this.#container.hidden = false; + } + get isVisible() { + if (this.#commentManager) { + return false; + } + return this.#container.hidden === false; + } +} +class FreeTextAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.textContent = parameters.data.textContent; + this.textPosition = parameters.data.textPosition; + this.annotationEditorType = AnnotationEditorType.FREETEXT; + } + render() { + this.container.classList.add("freeTextAnnotation"); + if (this.textContent) { + const content = document.createElement("div"); + content.classList.add("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.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class LineAnnotationElement extends AnnotationElement { + #line = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("lineAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const line = this.#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); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#line; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class SquareAnnotationElement extends AnnotationElement { + #square = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("squareAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const square = this.#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); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#square; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class CircleAnnotationElement extends AnnotationElement { + #circle = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("circleAnnotation"); + const { + data, + width, + height + } = this; + const svg = this.svgFactory.create(width, height, true); + const borderWidth = data.borderStyle.width; + const circle = this.#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); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#circle; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolylineAnnotationElement extends AnnotationElement { + #polyline = null; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "polylineAnnotation"; + this.svgElementName = "svg:polyline"; + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + vertices, + borderStyle, + popupRef + }, + width, + height + } = this; + if (!vertices) { + return this.container; + } + const svg = this.svgFactory.create(width, height, true); + let points = []; + for (let i = 0, ii = vertices.length; i < ii; i += 2) { + const x = vertices[i] - rect[0]; + const y = rect[3] - vertices[i + 1]; + points.push(`${x},${y}`); + } + points = points.join(" "); + const polyline = this.#polyline = this.svgFactory.createElement(this.svgElementName); + polyline.setAttribute("points", points); + polyline.setAttribute("stroke-width", borderStyle.width || 1); + polyline.setAttribute("stroke", "transparent"); + polyline.setAttribute("fill", "transparent"); + svg.append(polyline); + this.container.append(svg); + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } + getElementsToTriggerPopup() { + return this.#polyline; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class PolygonAnnotationElement extends PolylineAnnotationElement { + constructor(parameters) { + super(parameters); + this.containerClassName = "polygonAnnotation"; + this.svgElementName = "svg:polygon"; + } +} +class CaretAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + } + render() { + this.container.classList.add("caretAnnotation"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + return this.container; + } +} +class InkAnnotationElement extends AnnotationElement { + #polylinesGroupElement = null; + #polylines = []; + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.containerClassName = "inkAnnotation"; + this.svgElementName = "svg:polyline"; + this.annotationEditorType = this.data.it === "InkHighlight" ? AnnotationEditorType.HIGHLIGHT : AnnotationEditorType.INK; + } + #getTransform(rotation, rect) { + switch (rotation) { + case 90: + return { + transform: `rotate(90) translate(${-rect[0]},${rect[1]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + case 180: + return { + transform: `rotate(180) translate(${-rect[2]},${rect[1]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + case 270: + return { + transform: `rotate(270) translate(${-rect[2]},${rect[3]}) scale(1,-1)`, + width: rect[3] - rect[1], + height: rect[2] - rect[0] + }; + default: + return { + transform: `translate(${-rect[0]},${rect[3]}) scale(1,-1)`, + width: rect[2] - rect[0], + height: rect[3] - rect[1] + }; + } + } + render() { + this.container.classList.add(this.containerClassName); + const { + data: { + rect, + rotation, + inkLists, + borderStyle, + popupRef + } + } = this; + const { + transform, + width, + height + } = this.#getTransform(rotation, rect); + const svg = this.svgFactory.create(width, height, true); + const g = this.#polylinesGroupElement = this.svgFactory.createElement("svg:g"); + svg.append(g); + g.setAttribute("stroke-width", borderStyle.width || 1); + g.setAttribute("stroke-linecap", "round"); + g.setAttribute("stroke-linejoin", "round"); + g.setAttribute("stroke-miterlimit", 10); + g.setAttribute("stroke", "transparent"); + g.setAttribute("fill", "transparent"); + g.setAttribute("transform", transform); + for (let i = 0, ii = inkLists.length; i < ii; i++) { + const polyline = this.svgFactory.createElement(this.svgElementName); + this.#polylines.push(polyline); + polyline.setAttribute("points", inkLists[i].join(",")); + g.append(polyline); + } + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.append(svg); + this._editOnDoubleClick(); + return this.container; + } + updateEdited(params) { + super.updateEdited(params); + const { + thickness, + points, + rect + } = params; + const g = this.#polylinesGroupElement; + if (thickness >= 0) { + g.setAttribute("stroke-width", thickness || 1); + } + if (points) { + for (let i = 0, ii = this.#polylines.length; i < ii; i++) { + this.#polylines[i].setAttribute("points", points[i].join(",")); + } + } + if (rect) { + const { + transform, + width, + height + } = this.#getTransform(this.data.rotation, rect); + const root = g.parentElement; + root.setAttribute("viewBox", `0 0 ${width} ${height}`); + g.setAttribute("transform", transform); + } + } + getElementsToTriggerPopup() { + return this.#polylines; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } +} +class HighlightAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + this.annotationEditorType = AnnotationEditorType.HIGHLIGHT; + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("highlightAnnotation"); + this._editOnDoubleClick(); + if (overlaidText) { + const mark = document.createElement("mark"); + mark.classList.add("overlaidText"); + mark.textContent = overlaidText; + this.container.append(mark); + } + return this.container; + } +} +class UnderlineAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("underlineAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); + } + return this.container; + } +} +class SquigglyAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("squigglyAnnotation"); + if (overlaidText) { + const underline = document.createElement("u"); + underline.classList.add("overlaidText"); + underline.textContent = overlaidText; + this.container.append(underline); + } + return this.container; + } +} +class StrikeOutAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true, + createQuadrilaterals: true + }); + } + render() { + const { + data: { + overlaidText, + popupRef + } + } = this; + if (!popupRef && this.hasPopupData) { + this._createPopup(); + } + this.container.classList.add("strikeoutAnnotation"); + if (overlaidText) { + const strikeout = document.createElement("s"); + strikeout.classList.add("overlaidText"); + strikeout.textContent = overlaidText; + this.container.append(strikeout); + } + return this.container; + } +} +class StampAnnotationElement extends AnnotationElement { + constructor(parameters) { + super(parameters, { + isRenderable: true, + ignoreBorder: true + }); + this.annotationEditorType = AnnotationEditorType.STAMP; + } + render() { + this.container.classList.add("stampAnnotation"); + this.container.setAttribute("role", "img"); + if (!this.data.popupRef && this.hasPopupData) { + this._createPopup(); + } + this._editOnDoubleClick(); + return this.container; + } +} +class FileAttachmentAnnotationElement extends AnnotationElement { + #trigger = null; + constructor(parameters) { + super(parameters, { + isRenderable: true + }); + const { + file + } = this.data; + this.filename = file.filename; + this.content = file.content; + this.linkService.eventBus?.dispatch("fileattachmentannotation", { + source: this, + ...file + }); + } + render() { + this.container.classList.add("fileAttachmentAnnotation"); + const { + container, + data + } = this; + let trigger; + if (data.hasAppearance || data.fillAlpha === 0) { + trigger = document.createElement("div"); + } else { + trigger = document.createElement("img"); + trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`; + if (data.fillAlpha && data.fillAlpha < 1) { + trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`; + } + } + trigger.addEventListener("dblclick", this.#download.bind(this)); + this.#trigger = trigger; + const { + isMac + } = util_FeatureTest.platform; + container.addEventListener("keydown", evt => { + if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) { + this.#download(); + } + }); + if (!data.popupRef && this.hasPopupData) { + this._createPopup(); + } else { + trigger.classList.add("popupTriggerArea"); + } + container.append(trigger); + return container; + } + getElementsToTriggerPopup() { + return this.#trigger; + } + addHighlightArea() { + this.container.classList.add("highlightArea"); + } + #download() { + this.downloadManager?.openOrDownloadData(this.content, this.filename); + } +} +class AnnotationLayer { + #accessibilityManager = null; + #annotationCanvasMap = null; + #annotationStorage = null; + #editableAnnotations = new Map(); + #structTreeLayer = null; + #linkService = null; + constructor({ + div, + accessibilityManager, + annotationCanvasMap, + annotationEditorUIManager, + page, + viewport, + structTreeLayer, + commentManager, + linkService, + annotationStorage + }) { + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationCanvasMap = annotationCanvasMap; + this.#structTreeLayer = structTreeLayer || null; + this.#linkService = linkService || null; + this.#annotationStorage = annotationStorage || new AnnotationStorage(); + this.page = page; + this.viewport = viewport; + this.zIndex = 0; + this._annotationEditorUIManager = annotationEditorUIManager; + this._commentManager = commentManager || null; + } + hasEditableAnnotations() { + return this.#editableAnnotations.size > 0; + } + async #appendElement(element, id, popupElements) { + const contentElement = element.firstChild || element; + const annotationId = contentElement.id = `${AnnotationPrefix}${id}`; + const ariaAttributes = await this.#structTreeLayer?.getAriaAttributes(annotationId); + if (ariaAttributes) { + for (const [key, value] of ariaAttributes) { + contentElement.setAttribute(key, value); + } + } + if (popupElements) { + popupElements.at(-1).container.after(element); + } else { + this.div.append(element); + this.#accessibilityManager?.moveElementInDOM(this.div, element, contentElement, false); + } + } + async render(params) { + const { + annotations + } = params; + const layer = this.div; + setLayerDimensions(layer, this.viewport); + const popupToElements = new Map(); + const elementParams = { + data: null, + layer, + linkService: this.#linkService, + downloadManager: params.downloadManager, + imageResourcesPath: params.imageResourcesPath || "", + renderForms: params.renderForms !== false, + svgFactory: new DOMSVGFactory(), + annotationStorage: this.#annotationStorage, + enableComment: params.enableComment === true, + enableScripting: params.enableScripting === true, + hasJSActions: params.hasJSActions, + fieldObjects: params.fieldObjects, + parent: this, + elements: null + }; + for (const data of annotations) { + if (data.noHTML) { + continue; + } + const isPopupAnnotation = data.annotationType === AnnotationType.POPUP; + if (!isPopupAnnotation) { + if (data.rect[2] === data.rect[0] || data.rect[3] === data.rect[1]) { + continue; + } + } else { + const elements = popupToElements.get(data.id); + if (!elements) { + continue; + } + elementParams.elements = elements; + } + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + if (!isPopupAnnotation && data.popupRef) { + const elements = popupToElements.get(data.popupRef); + if (!elements) { + popupToElements.set(data.popupRef, [element]); + } else { + elements.push(element); + } + } + const rendered = element.render(); + if (data.hidden) { + rendered.style.visibility = "hidden"; + } + await this.#appendElement(rendered, data.id, elementParams.elements); + element.extraPopupElement?.popup?.renderCommentButton(); + if (element._isEditable) { + this.#editableAnnotations.set(element.data.id, element); + this._annotationEditorUIManager?.renderAnnotationElement(element); + } + } + this.#setAnnotationCanvasMap(); + } + async addLinkAnnotations(annotations) { + const elementParams = { + data: null, + layer: this.div, + linkService: this.#linkService, + svgFactory: new DOMSVGFactory(), + parent: this + }; + for (const data of annotations) { + data.borderStyle ||= AnnotationLayer._defaultBorderStyle; + elementParams.data = data; + const element = AnnotationElementFactory.create(elementParams); + if (!element.isRenderable) { + continue; + } + const rendered = element.render(); + await this.#appendElement(rendered, data.id, null); + } + } + update({ + viewport + }) { + const layer = this.div; + this.viewport = viewport; + setLayerDimensions(layer, { + rotation: viewport.rotation + }); + this.#setAnnotationCanvasMap(); + layer.hidden = false; + } + #setAnnotationCanvasMap() { + if (!this.#annotationCanvasMap) { + return; + } + const layer = this.div; + for (const [id, canvas] of this.#annotationCanvasMap) { + const element = layer.querySelector(`[data-annotation-id="${id}"]`); + if (!element) { + continue; + } + canvas.className = "annotationContent"; + const { + firstChild + } = element; + if (!firstChild) { + element.append(canvas); + } else if (firstChild.nodeName === "CANVAS") { + firstChild.replaceWith(canvas); + } else if (!firstChild.classList.contains("annotationContent")) { + firstChild.before(canvas); + } else { + firstChild.after(canvas); + } + const editableAnnotation = this.#editableAnnotations.get(id); + if (!editableAnnotation) { + continue; + } + if (editableAnnotation._hasNoCanvas) { + this._annotationEditorUIManager?.setMissingCanvas(id, element.id, canvas); + editableAnnotation._hasNoCanvas = false; + } else { + editableAnnotation.canvas = canvas; + } + } + this.#annotationCanvasMap.clear(); + } + getEditableAnnotations() { + return Array.from(this.#editableAnnotations.values()); + } + getEditableAnnotation(id) { + return this.#editableAnnotations.get(id); + } + addFakeAnnotation(editor) { + const { + div + } = this; + const { + id, + rotation + } = editor; + const element = new EditorAnnotationElement({ + data: { + id, + rect: editor.getPDFRect(), + rotation + }, + editor, + layer: div, + parent: this, + enableComment: !!this._commentManager, + linkService: this.#linkService, + annotationStorage: this.#annotationStorage + }); + const htmlElement = element.render(); + div.append(htmlElement); + this.#accessibilityManager?.moveElementInDOM(div, htmlElement, htmlElement, false); + element.createOrUpdatePopup(); + return element; + } + static get _defaultBorderStyle() { + return shadow(this, "_defaultBorderStyle", Object.freeze({ + width: 1, + rawWidth: 1, + style: AnnotationBorderStyleType.SOLID, + dashArray: [3], + horizontalCornerRadius: 0, + verticalCornerRadius: 0 + })); + } +} + +;// ./src/display/editor/freetext.js + + + + + +const EOL_PATTERN = /\r\n?|\n/g; +class FreeTextEditor extends AnnotationEditor { + #content = ""; + #editorDivId = `${this.id}-editor`; + #editModeAC = null; + #fontSize; + _colorPicker = null; + static _freeTextDefaultContent = ""; + static _internalPadding = 0; + static _defaultColor = null; + static _defaultFontSize = 10; + static get _keyboardManager() { + const proto = FreeTextEditor.prototype; + const arrowChecker = self => self.isEmpty(); + const small = AnnotationEditorUIManager.TRANSLATE_SMALL; + const big = AnnotationEditorUIManager.TRANSLATE_BIG; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, { + bubbles: true + }], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, { + args: [-small, 0], + checker: arrowChecker + }], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, { + args: [-big, 0], + checker: arrowChecker + }], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, { + args: [small, 0], + checker: arrowChecker + }], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, { + args: [big, 0], + checker: arrowChecker + }], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, { + args: [0, -small], + checker: arrowChecker + }], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, { + args: [0, -big], + checker: arrowChecker + }], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, { + args: [0, small], + checker: arrowChecker + }], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, { + args: [0, big], + checker: arrowChecker + }]])); + } + static _type = "freetext"; + static _editorType = AnnotationEditorType.FREETEXT; + constructor(params) { + super({ + ...params, + name: "freeTextEditor" + }); + this.color = params.color || FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor; + this.#fontSize = params.fontSize || FreeTextEditor._defaultFontSize; + if (!this.annotationElementId) { + this._uiManager.a11yAlert("pdfjs-editor-freetext-added-alert"); + } + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + const style = getComputedStyle(document.documentElement); + this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding")); + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + FreeTextEditor._defaultFontSize = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + FreeTextEditor._defaultColor = value; + break; + } + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + this.#updateFontSize(value); + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + this.#updateColor(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.FREETEXT_SIZE, this.#fontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, this.color]]; + } + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; + } + get colorType() { + return AnnotationEditorParamsType.FREETEXT_COLOR; + } + #updateFontSize(fontSize) { + const setFontsize = size => { + this.editorDiv.style.fontSize = `calc(${size}px * var(--total-scale-factor))`; + this.translate(0, -(size - this.#fontSize) * this.parentScale); + this.#fontSize = size; + this.#setEditorDimensions(); + }; + const savedFontsize = this.#fontSize; + this.addCommands({ + cmd: setFontsize.bind(this, fontSize), + undo: setFontsize.bind(this, savedFontsize), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_SIZE, + overwriteIfSameType: true, + keepUndo: true + }); + } + onUpdatedColor() { + this.editorDiv.style.color = this.color; + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + #updateColor(color) { + const setColor = col => { + this.color = col; + this.onUpdatedColor(); + }; + const savedColor = this.color; + this.addCommands({ + cmd: setColor.bind(this, color), + undo: setColor.bind(this, savedColor), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.FREETEXT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + } + _translateEmpty(x, y) { + this._uiManager.translateSelectedEditors(x, y, true); + } + getInitialTranslation() { + const scale = this.parentScale; + return [-FreeTextEditor._internalPadding * scale, -(FreeTextEditor._internalPadding + this.#fontSize) * scale]; + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + enableEditMode() { + if (!super.enableEditMode()) { + return false; + } + this.overlayDiv.classList.remove("enabled"); + this.editorDiv.contentEditable = true; + this._isDraggable = false; + this.div.removeAttribute("aria-activedescendant"); + this.#editModeAC = new AbortController(); + const signal = this._uiManager.combinedSignal(this.#editModeAC); + this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), { + signal + }); + this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), { + signal + }); + this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), { + signal + }); + this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), { + signal + }); + this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), { + signal + }); + return true; + } + disableEditMode() { + if (!super.disableEditMode()) { + return false; + } + this.overlayDiv.classList.add("enabled"); + this.editorDiv.contentEditable = false; + this.div.setAttribute("aria-activedescendant", this.#editorDivId); + this._isDraggable = true; + this.#editModeAC?.abort(); + this.#editModeAC = null; + this.div.focus({ + preventScroll: true + }); + this.isEditing = false; + this.parent.div.classList.add("freetextEditing"); + return true; + } + focusin(event) { + if (!this._focusEventsAllowed) { + return; + } + super.focusin(event); + if (event.target !== this.editorDiv) { + this.editorDiv.focus(); + } + } + onceAdded(focus) { + if (this.width) { + return; + } + this.enableEditMode(); + if (focus) { + this.editorDiv.focus(); + } + if (this._initialOptions?.isCentered) { + this.center(); + } + this._initialOptions = null; + } + isEmpty() { + return !this.editorDiv || this.editorDiv.innerText.trim() === ""; + } + remove() { + this.isEditing = false; + if (this.parent) { + this.parent.setEditingState(true); + this.parent.div.classList.add("freetextEditing"); + } + super.remove(); + } + #extractText() { + const buffer = []; + this.editorDiv.normalize(); + let prevChild = null; + for (const child of this.editorDiv.childNodes) { + if (prevChild?.nodeType === Node.TEXT_NODE && child.nodeName === "BR") { + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + prevChild = child; + } + 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; + const savedVisibility = div.classList.contains("hidden"); + div.classList.remove("hidden"); + div.style.display = "hidden"; + currentLayer.div.append(this.div); + rect = div.getBoundingClientRect(); + div.remove(); + div.style.display = savedDisplay; + div.classList.toggle("hidden", savedVisibility); + } + if (this.rotation % 180 === this.parentRotation % 180) { + this.width = rect.width / parentWidth; + this.height = rect.height / parentHeight; + } else { + this.width = rect.height / parentWidth; + this.height = rect.width / parentHeight; + } + this.fixAndSetPosition(); + } + commit() { + if (!this.isInEditMode()) { + return; + } + super.commit(); + this.disableEditMode(); + const savedText = this.#content; + const newText = this.#content = this.#extractText().trimEnd(); + if (savedText === newText) { + return; + } + const setText = text => { + this.#content = text; + if (!text) { + this.remove(); + return; + } + this.#setContent(); + this._uiManager.rebuild(this); + this.#setEditorDimensions(); + }; + this.addCommands({ + cmd: () => { + setText(newText); + }, + undo: () => { + setText(savedText); + }, + mustExec: false + }); + this.#setEditorDimensions(); + } + shouldGetKeyboardEvents() { + return this.isInEditMode(); + } + enterInEditMode() { + this.enableEditMode(); + this.editorDiv.focus(); + } + keydown(event) { + if (event.target === this.div && event.key === "Enter") { + this.enterInEditMode(); + event.preventDefault(); + } + } + 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); + } + get canChangeContent() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy || this.annotationElementId) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.editorDiv = document.createElement("div"); + this.editorDiv.className = "internal"; + this.editorDiv.setAttribute("id", this.#editorDivId); + this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text2"); + this.editorDiv.setAttribute("data-l10n-attrs", "default-content"); + this.enableEditing(); + this.editorDiv.contentEditable = true; + const { + style + } = this.editorDiv; + style.fontSize = `calc(${this.#fontSize}px * var(--total-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); + if (this._isCopy || this.annotationElementId) { + const [parentWidth, parentHeight] = this.parentDimensions; + if (this.annotationElementId) { + const { + position + } = this._initialData; + let [tx, ty] = this.getInitialTranslation(); + [tx, ty] = this.pageTranslationToScreen(tx, ty); + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + let posX, posY; + switch (this.rotation) { + case 0: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY + this.height - (position[1] - pageY) / pageHeight; + break; + case 90: + posX = baseX + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [ty, -tx]; + break; + case 180: + posX = baseX - this.width + (position[0] - pageX) / pageWidth; + posY = baseY - (position[1] - pageY) / pageHeight; + [tx, ty] = [-tx, -ty]; + break; + case 270: + posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth; + posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight; + [tx, ty] = [-ty, tx]; + break; + } + this.setAt(posX * parentWidth, posY * parentHeight, tx, ty); + } else { + this._moveAfterPaste(baseX, baseY); + } + this.#setContent(); + this._isDraggable = true; + this.editorDiv.contentEditable = false; + } else { + this._isDraggable = false; + this.editorDiv.contentEditable = true; + } + return this.div; + } + static #getNodeContent(node) { + return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, ""); + } + editorDivPaste(event) { + const clipboardData = event.clipboardData || window.clipboardData; + const { + types + } = clipboardData; + if (types.length === 1 && types[0] === "text/plain") { + return; + } + event.preventDefault(); + const paste = FreeTextEditor.#deserializeContent(clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n"); + if (!paste) { + return; + } + const selection = window.getSelection(); + if (!selection.rangeCount) { + return; + } + this.editorDiv.normalize(); + selection.deleteFromDocument(); + const range = selection.getRangeAt(0); + if (!paste.includes("\n")) { + range.insertNode(document.createTextNode(paste)); + this.editorDiv.normalize(); + selection.collapseToStart(); + return; + } + const { + startContainer, + startOffset + } = range; + const bufferBefore = []; + const bufferAfter = []; + if (startContainer.nodeType === Node.TEXT_NODE) { + const parent = startContainer.parentElement; + bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, "")); + if (parent !== this.editorDiv) { + let buffer = bufferBefore; + for (const child of this.editorDiv.childNodes) { + if (child === parent) { + buffer = bufferAfter; + continue; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, "")); + } else if (startContainer === this.editorDiv) { + let buffer = bufferBefore; + let i = 0; + for (const child of this.editorDiv.childNodes) { + if (i++ === startOffset) { + buffer = bufferAfter; + } + buffer.push(FreeTextEditor.#getNodeContent(child)); + } + } + this.#content = `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`; + this.#setContent(); + const newRange = new Range(); + let beforeLength = Math.sumPrecise(bufferBefore.map(line => line.length)); + for (const { + firstChild + } of this.editorDiv.childNodes) { + if (firstChild.nodeType === Node.TEXT_NODE) { + const length = firstChild.nodeValue.length; + if (beforeLength <= length) { + newRange.setStart(firstChild, beforeLength); + newRange.setEnd(firstChild, beforeLength); + break; + } + beforeLength -= length; + } + } + selection.removeAllRanges(); + selection.addRange(newRange); + } + #setContent() { + this.editorDiv.replaceChildren(); + if (!this.#content) { + return; + } + 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); + } + } + #serializeContent() { + return this.#content.replaceAll("\xa0", " "); + } + static #deserializeContent(content) { + return content.replaceAll(" ", "\xa0"); + } + get contentDiv() { + return this.editorDiv; + } + getPDFRect() { + const padding = FreeTextEditor._internalPadding * this.parentScale; + return this.getRect(padding, padding); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof FreeTextAnnotationElement) { + const { + data: { + defaultAppearanceData: { + fontSize, + fontColor + }, + rect, + rotation, + id, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + textContent, + textPosition, + parent: { + page: { + pageNumber + } + } + } = data; + if (!textContent || textContent.length === 0) { + return null; + } + initialData = data = { + annotationType: AnnotationEditorType.FREETEXT, + color: Array.from(fontColor), + fontSize, + value: textContent.join("\n"), + position: textPosition, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + comment: contentsObj?.str || null, + richText, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor.#fontSize = data.fontSize; + editor.color = Util.makeHexColor(...data.color); + editor.#content = FreeTextEditor.#deserializeContent(data.value); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const color = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : this.color); + const serialized = Object.assign(super.serialize(isForCopying), { + color, + fontSize: this.#fontSize, + value: this.#serializeContent() + }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + value, + fontSize, + color, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color[i]) || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + const content = super.renderAnnotationElement(annotation); + if (!content) { + return null; + } + const { + style + } = content; + style.fontSize = `calc(${this.#fontSize}px * var(--total-scale-factor))`; + style.color = this.color; + content.replaceChildren(); + for (const line of this.#content.split("\n")) { + const div = document.createElement("div"); + div.append(line ? document.createTextNode(line) : document.createElement("br")); + content.append(div); + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this._uiManager.hasCommentManager() || this.hasEditedComment ? this.comment : { + text: this.#content + } + }); + return content; + } + resetAnnotationElement(annotation) { + super.resetAnnotationElement(annotation); + annotation.resetEdited(); + } +} + +;// ./src/display/editor/drawers/outline.js + +class Outline { + static PRECISION = 1e-4; + toSVGPath() { + unreachable("Abstract method `toSVGPath` must be implemented."); + } + get box() { + unreachable("Abstract getter `box` must be implemented."); + } + serialize(_bbox, _rotation) { + unreachable("Abstract method `serialize` must be implemented."); + } + static _rescale(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i] * sx; + dest[i + 1] = ty + src[i + 1] * sy; + } + return dest; + } + static _rescaleAndSwap(src, tx, ty, sx, sy, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i + 1] * sx; + dest[i + 1] = ty + src[i] * sy; + } + return dest; + } + static _translate(src, tx, ty, dest) { + dest ||= new Float32Array(src.length); + for (let i = 0, ii = src.length; i < ii; i += 2) { + dest[i] = tx + src[i]; + dest[i + 1] = ty + src[i + 1]; + } + return dest; + } + static svgRound(x) { + return Math.round(x * 10000); + } + static _normalizePoint(x, y, parentWidth, parentHeight, rotation) { + switch (rotation) { + case 90: + return [1 - y / parentWidth, x / parentHeight]; + case 180: + return [1 - x / parentWidth, 1 - y / parentHeight]; + case 270: + return [y / parentWidth, 1 - x / parentHeight]; + default: + return [x / parentWidth, y / parentHeight]; + } + } + static _normalizePagePoint(x, y, rotation) { + switch (rotation) { + case 90: + return [1 - y, x]; + case 180: + return [1 - x, 1 - y]; + case 270: + return [y, 1 - x]; + default: + return [x, y]; + } + } + static createBezierPoints(x1, y1, x2, y2, x3, y3) { + return [(x1 + 5 * x2) / 6, (y1 + 5 * y2) / 6, (5 * x2 + x3) / 6, (5 * y2 + y3) / 6, (x2 + x3) / 2, (y2 + y3) / 2]; + } +} + +;// ./src/display/editor/drawers/freedraw.js + + +class FreeDrawOutliner { + #box; + #bottom = []; + #innerMargin; + #isLTR; + #top = []; + #last = new Float32Array(18); + #lastX; + #lastY; + #min; + #min_dist; + #scaleFactor; + #thickness; + #points = []; + static #MIN_DIST = 8; + static #MIN_DIFF = 2; + static #MIN = FreeDrawOutliner.#MIN_DIST + FreeDrawOutliner.#MIN_DIFF; + constructor({ + x, + y + }, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + this.#box = box; + this.#thickness = thickness * scaleFactor; + this.#isLTR = isLTR; + this.#last.set([NaN, NaN, NaN, NaN, x, y], 6); + this.#innerMargin = innerMargin; + this.#min_dist = FreeDrawOutliner.#MIN_DIST * scaleFactor; + this.#min = FreeDrawOutliner.#MIN * scaleFactor; + this.#scaleFactor = scaleFactor; + this.#points.push(x, y); + } + isEmpty() { + return isNaN(this.#last[8]); + } + #getLastCoords() { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [x, y, width, height] = this.#box; + return [(this.#lastX + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (this.#lastY + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (this.#lastX + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (this.#lastY + (lastBottom[1] - lastTop[1]) / 2 - y) / height]; + } + add({ + x, + y + }) { + this.#lastX = x; + this.#lastY = y; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + let [x1, y1, x2, y2] = this.#last.subarray(8, 12); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(diffX, diffY); + if (d < this.#min) { + return false; + } + const diffD = d - this.#min_dist; + const K = diffD / d; + const shiftX = K * diffX; + const shiftY = K * diffY; + let x0 = x1; + let y0 = y1; + x1 = x2; + y1 = y2; + x2 += shiftX; + y2 += shiftY; + this.#points?.push(x, y); + const nX = -shiftY / diffD; + const nY = shiftX / diffD; + const thX = nX * this.#thickness; + const thY = nY * this.#thickness; + this.#last.set(this.#last.subarray(2, 8), 0); + this.#last.set([x2 + thX, y2 + thY], 4); + this.#last.set(this.#last.subarray(14, 18), 12); + this.#last.set([x2 - thX, y2 - thY], 16); + if (isNaN(this.#last[6])) { + if (this.#top.length === 0) { + this.#last.set([x1 + thX, y1 + thY], 2); + this.#top.push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight); + this.#last.set([x1 - thX, y1 - thY], 14); + this.#bottom.push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + return !this.isEmpty(); + } + this.#last.set([x0, y0, x1, y1, x2, y2], 6); + const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX)); + if (angle < Math.PI / 2) { + [x1, y1, x2, y2] = this.#last.subarray(2, 6); + this.#top.push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x1, y1, x0, y0] = this.#last.subarray(14, 18); + this.#bottom.push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight); + return true; + } + [x0, y0, x1, y1, x2, y2] = this.#last.subarray(0, 6); + this.#top.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + [x2, y2, x1, y1, x0, y0] = this.#last.subarray(12, 18); + this.#bottom.push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight); + return true; + } + toSVGPath() { + if (this.isEmpty()) { + return ""; + } + const top = this.#top; + const bottom = this.#bottom; + if (isNaN(this.#last[6]) && !this.isEmpty()) { + return this.#toSVGPathTwoPoints(); + } + const buffer = []; + buffer.push(`M${top[4]} ${top[5]}`); + for (let i = 6; i < top.length; i += 6) { + if (isNaN(top[i])) { + buffer.push(`L${top[i + 4]} ${top[i + 5]}`); + } else { + buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`); + } + } + this.#toSVGPathEnd(buffer); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + if (isNaN(bottom[i])) { + buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`); + } else { + buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`); + } + } + this.#toSVGPathStart(buffer); + return buffer.join(" "); + } + #toSVGPathTwoPoints() { + const [x, y, width, height] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + return `M${(this.#last[2] - x) / width} ${(this.#last[3] - y) / height} L${(this.#last[4] - x) / width} ${(this.#last[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(this.#last[16] - x) / width} ${(this.#last[17] - y) / height} L${(this.#last[14] - x) / width} ${(this.#last[15] - y) / height} Z`; + } + #toSVGPathStart(buffer) { + const bottom = this.#bottom; + buffer.push(`L${bottom[4]} ${bottom[5]} Z`); + } + #toSVGPathEnd(buffer) { + const [x, y, width, height] = this.#box; + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`); + } + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } + getOutlines() { + const top = this.#top; + const bottom = this.#bottom; + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const points = new Float32Array((this.#points?.length ?? 0) + 2); + for (let i = 0, ii = points.length - 2; i < ii; i += 2) { + points[i] = (this.#points[i] - layerX) / layerWidth; + points[i + 1] = (this.#points[i + 1] - layerY) / layerHeight; + } + points[points.length - 2] = (this.#lastX - layerX) / layerWidth; + points[points.length - 1] = (this.#lastY - layerY) / layerHeight; + if (isNaN(last[6]) && !this.isEmpty()) { + return this.#getOutlineTwoPoints(points); + } + const outline = new Float32Array(this.#top.length + 24 + this.#bottom.length); + let N = top.length; + for (let i = 0; i < N; i += 2) { + if (isNaN(top[i])) { + outline[i] = outline[i + 1] = NaN; + continue; + } + outline[i] = top[i]; + outline[i + 1] = top[i + 1]; + } + N = this.#getOutlineEnd(outline, N); + for (let i = bottom.length - 6; i >= 6; i -= 6) { + for (let j = 0; j < 6; j += 2) { + if (isNaN(bottom[i + j])) { + outline[N] = outline[N + 1] = NaN; + N += 2; + continue; + } + outline[N] = bottom[i + j]; + outline[N + 1] = bottom[i + j + 1]; + N += 2; + } + } + this.#getOutlineStart(outline, N); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineTwoPoints(points) { + const last = this.#last; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + const outline = new Float32Array(36); + outline.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0); + return this.newFreeDrawOutline(outline, points, this.#box, this.#scaleFactor, this.#innerMargin, this.#isLTR); + } + #getOutlineStart(outline, pos) { + const bottom = this.#bottom; + outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], pos); + return pos += 6; + } + #getOutlineEnd(outline, pos) { + const lastTop = this.#last.subarray(4, 6); + const lastBottom = this.#last.subarray(16, 18); + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const [lastTopX, lastTopY, lastBottomX, lastBottomY] = this.#getLastCoords(); + outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], pos); + return pos += 24; + } +} +class FreeDrawOutline extends Outline { + #box; + #bbox = new Float32Array(4); + #innerMargin; + #isLTR; + #points; + #scaleFactor; + #outline; + constructor(outline, points, box, scaleFactor, innerMargin, isLTR) { + super(); + this.#outline = outline; + this.#points = points; + this.#box = box; + this.#scaleFactor = scaleFactor; + this.#innerMargin = innerMargin; + this.#isLTR = isLTR; + this.firstPoint = [NaN, NaN]; + this.lastPoint = [NaN, NaN]; + this.#computeMinMax(isLTR); + const [x, y, width, height] = this.#bbox; + for (let i = 0, ii = outline.length; i < ii; i += 2) { + outline[i] = (outline[i] - x) / width; + outline[i + 1] = (outline[i + 1] - y) / height; + } + for (let i = 0, ii = points.length; i < ii; i += 2) { + points[i] = (points[i] - x) / width; + points[i + 1] = (points[i + 1] - y) / height; + } + } + toSVGPath() { + const buffer = [`M${this.#outline[4]} ${this.#outline[5]}`]; + for (let i = 6, ii = this.#outline.length; i < ii; i += 6) { + if (isNaN(this.#outline[i])) { + buffer.push(`L${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + continue; + } + buffer.push(`C${this.#outline[i]} ${this.#outline[i + 1]} ${this.#outline[i + 2]} ${this.#outline[i + 3]} ${this.#outline[i + 4]} ${this.#outline[i + 5]}`); + } + buffer.push("Z"); + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], rotation) { + const width = trX - blX; + const height = trY - blY; + let outline; + let points; + switch (rotation) { + case 0: + outline = Outline._rescale(this.#outline, blX, trY, width, -height); + points = Outline._rescale(this.#points, blX, trY, width, -height); + break; + case 90: + outline = Outline._rescaleAndSwap(this.#outline, blX, blY, width, height); + points = Outline._rescaleAndSwap(this.#points, blX, blY, width, height); + break; + case 180: + outline = Outline._rescale(this.#outline, trX, blY, -width, height); + points = Outline._rescale(this.#points, trX, blY, -width, height); + break; + case 270: + outline = Outline._rescaleAndSwap(this.#outline, trX, trY, -width, -height); + points = Outline._rescaleAndSwap(this.#points, trX, trY, -width, -height); + break; + } + return { + outline: Array.from(outline), + points: [Array.from(points)] + }; + } + #computeMinMax(isLTR) { + const outline = this.#outline; + let lastX = outline[4]; + let lastY = outline[5]; + const minMax = [lastX, lastY, lastX, lastY]; + let firstPointX = lastX; + let firstPointY = lastY; + let lastPointX = lastX; + let lastPointY = lastY; + const ltrCallback = isLTR ? Math.max : Math.min; + const bezierBbox = new Float32Array(4); + for (let i = 6, ii = outline.length; i < ii; i += 6) { + const x = outline[i + 4], + y = outline[i + 5]; + if (isNaN(outline[i])) { + Util.pointBoundingBox(x, y, minMax); + if (firstPointY > y) { + firstPointX = x; + firstPointY = y; + } else if (firstPointY === y) { + firstPointX = ltrCallback(firstPointX, x); + } + if (lastPointY < y) { + lastPointX = x; + lastPointY = y; + } else if (lastPointY === y) { + lastPointX = ltrCallback(lastPointX, x); + } + } else { + bezierBbox[0] = bezierBbox[1] = Infinity; + bezierBbox[2] = bezierBbox[3] = -Infinity; + Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6), bezierBbox); + Util.rectBoundingBox(bezierBbox[0], bezierBbox[1], bezierBbox[2], bezierBbox[3], minMax); + if (firstPointY > bezierBbox[1]) { + firstPointX = bezierBbox[0]; + firstPointY = bezierBbox[1]; + } else if (firstPointY === bezierBbox[1]) { + firstPointX = ltrCallback(firstPointX, bezierBbox[0]); + } + if (lastPointY < bezierBbox[3]) { + lastPointX = bezierBbox[2]; + lastPointY = bezierBbox[3]; + } else if (lastPointY === bezierBbox[3]) { + lastPointX = ltrCallback(lastPointX, bezierBbox[2]); + } + } + lastX = x; + lastY = y; + } + const bbox = this.#bbox; + bbox[0] = minMax[0] - this.#innerMargin; + bbox[1] = minMax[1] - this.#innerMargin; + bbox[2] = minMax[2] - minMax[0] + 2 * this.#innerMargin; + bbox[3] = minMax[3] - minMax[1] + 2 * this.#innerMargin; + this.firstPoint = [firstPointX, firstPointY]; + this.lastPoint = [lastPointX, lastPointY]; + } + get box() { + return this.#bbox; + } + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeDrawOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } + getNewOutline(thickness, innerMargin) { + const [x, y, width, height] = this.#bbox; + const [layerX, layerY, layerWidth, layerHeight] = this.#box; + const sx = width * layerWidth; + const sy = height * layerHeight; + const tx = x * layerWidth + layerX; + const ty = y * layerHeight + layerY; + const outliner = this.newOutliner({ + x: this.#points[0] * sx + tx, + y: this.#points[1] * sy + ty + }, this.#box, this.#scaleFactor, thickness, this.#isLTR, innerMargin ?? this.#innerMargin); + for (let i = 2; i < this.#points.length; i += 2) { + outliner.add({ + x: this.#points[i] * sx + tx, + y: this.#points[i + 1] * sy + ty + }); + } + return outliner.getOutlines(); + } +} + +;// ./src/display/editor/drawers/highlight.js + + + +class HighlightOutliner { + #box; + #firstPoint; + #lastPoint; + #verticalEdges = []; + #intervals = []; + constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) { + const minMax = [Infinity, Infinity, -Infinity, -Infinity]; + const NUMBER_OF_DIGITS = 4; + const EPSILON = 10 ** -NUMBER_OF_DIGITS; + for (const { + x, + y, + width, + height + } of boxes) { + const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON; + const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON; + const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON; + const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON; + const left = [x1, y1, y2, true]; + const right = [x2, y1, y2, false]; + this.#verticalEdges.push(left, right); + Util.rectBoundingBox(x1, y1, x2, y2, minMax); + } + const bboxWidth = minMax[2] - minMax[0] + 2 * innerMargin; + const bboxHeight = minMax[3] - minMax[1] + 2 * innerMargin; + const shiftedMinX = minMax[0] - innerMargin; + const shiftedMinY = minMax[1] - innerMargin; + let firstPointX = isLTR ? -Infinity : Infinity; + let firstPointY = Infinity; + const lastEdge = this.#verticalEdges.at(isLTR ? -1 : -2); + const lastPoint = [lastEdge[0], lastEdge[2]]; + for (const edge of this.#verticalEdges) { + const [x, y1, y2, left] = edge; + if (!left && isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.max(firstPointX, x); + } + } else if (left && !isLTR) { + if (y1 < firstPointY) { + firstPointY = y1; + firstPointX = x; + } else if (y1 === firstPointY) { + firstPointX = Math.min(firstPointX, x); + } + } + edge[0] = (x - shiftedMinX) / bboxWidth; + edge[1] = (y1 - shiftedMinY) / bboxHeight; + edge[2] = (y2 - shiftedMinY) / bboxHeight; + } + this.#box = new Float32Array([shiftedMinX, shiftedMinY, bboxWidth, bboxHeight]); + this.#firstPoint = [firstPointX, firstPointY]; + this.#lastPoint = lastPoint; + } + getOutlines() { + this.#verticalEdges.sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]); + const outlineVerticalEdges = []; + for (const edge of this.#verticalEdges) { + if (edge[3]) { + outlineVerticalEdges.push(...this.#breakEdge(edge)); + this.#insert(edge); + } else { + this.#remove(edge); + outlineVerticalEdges.push(...this.#breakEdge(edge)); + } + } + return this.#getOutlines(outlineVerticalEdges); + } + #getOutlines(outlineVerticalEdges) { + const edges = []; + const allEdges = new Set(); + for (const edge of outlineVerticalEdges) { + const [x, y1, y2] = edge; + edges.push([x, y1, edge], [x, y2, edge]); + } + edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]); + for (let i = 0, ii = edges.length; i < ii; i += 2) { + const edge1 = edges[i][2]; + const edge2 = edges[i + 1][2]; + edge1.push(edge2); + edge2.push(edge1); + allEdges.add(edge1); + allEdges.add(edge2); + } + const outlines = []; + let outline; + while (allEdges.size > 0) { + const edge = allEdges.values().next().value; + let [x, y1, y2, edge1, edge2] = edge; + allEdges.delete(edge); + let lastPointX = x; + let lastPointY = y1; + outline = [x, y2]; + outlines.push(outline); + while (true) { + let e; + if (allEdges.has(edge1)) { + e = edge1; + } else if (allEdges.has(edge2)) { + e = edge2; + } else { + break; + } + allEdges.delete(e); + [x, y1, y2, edge1, edge2] = e; + if (lastPointX !== x) { + outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2); + lastPointX = x; + } + lastPointY = lastPointY === y1 ? y2 : y1; + } + outline.push(lastPointX, lastPointY); + } + return new HighlightOutline(outlines, this.#box, this.#firstPoint, this.#lastPoint); + } + #binarySearch(y) { + const array = this.#intervals; + let start = 0; + let end = array.length - 1; + while (start <= end) { + const middle = start + end >> 1; + const y1 = array[middle][0]; + if (y1 === y) { + return middle; + } + if (y1 < y) { + start = middle + 1; + } else { + end = middle - 1; + } + } + return end + 1; + } + #insert([, y1, y2]) { + const index = this.#binarySearch(y1); + this.#intervals.splice(index, 0, [y1, y2]); + } + #remove([, y1, y2]) { + const index = this.#binarySearch(y1); + for (let i = index; i < this.#intervals.length; i++) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + for (let i = index - 1; i >= 0; i--) { + const [start, end] = this.#intervals[i]; + if (start !== y1) { + break; + } + if (start === y1 && end === y2) { + this.#intervals.splice(i, 1); + return; + } + } + } + #breakEdge(edge) { + const [x, y1, y2] = edge; + const results = [[x, y1, y2]]; + const index = this.#binarySearch(y2); + for (let i = 0; i < index; i++) { + const [start, end] = this.#intervals[i]; + for (let j = 0, jj = results.length; j < jj; j++) { + const [, y3, y4] = results[j]; + if (end <= y3 || y4 <= start) { + continue; + } + if (y3 >= start) { + if (y4 > end) { + results[j][1] = end; + } else { + if (jj === 1) { + return []; + } + results.splice(j, 1); + j--; + jj--; + } + continue; + } + results[j][2] = start; + if (y4 > end) { + results.push([x, end, y4]); + } + } + } + return results; + } +} +class HighlightOutline extends Outline { + #box; + #outlines; + constructor(outlines, box, firstPoint, lastPoint) { + super(); + this.#outlines = outlines; + this.#box = box; + this.firstPoint = firstPoint; + this.lastPoint = lastPoint; + } + toSVGPath() { + const buffer = []; + for (const polygon of this.#outlines) { + let [prevX, prevY] = polygon; + buffer.push(`M${prevX} ${prevY}`); + for (let i = 2; i < polygon.length; i += 2) { + const x = polygon[i]; + const y = polygon[i + 1]; + if (x === prevX) { + buffer.push(`V${y}`); + prevY = y; + } else if (y === prevY) { + buffer.push(`H${x}`); + prevX = x; + } + } + buffer.push("Z"); + } + return buffer.join(" "); + } + serialize([blX, blY, trX, trY], _rotation) { + const outlines = []; + const width = trX - blX; + const height = trY - blY; + for (const outline of this.#outlines) { + const points = new Array(outline.length); + for (let i = 0; i < outline.length; i += 2) { + points[i] = blX + outline[i] * width; + points[i + 1] = trY - outline[i + 1] * height; + } + outlines.push(points); + } + return outlines; + } + get box() { + return this.#box; + } + get classNamesForOutlining() { + return ["highlightOutline"]; + } +} +class FreeHighlightOutliner extends FreeDrawOutliner { + newFreeDrawOutline(outline, points, box, scaleFactor, innerMargin, isLTR) { + return new FreeHighlightOutline(outline, points, box, scaleFactor, innerMargin, isLTR); + } +} +class FreeHighlightOutline extends FreeDrawOutline { + newOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin = 0) { + return new FreeHighlightOutliner(point, box, scaleFactor, thickness, isLTR, innerMargin); + } +} + +;// ./src/display/editor/highlight.js + + + + + + + +class HighlightEditor extends AnnotationEditor { + #anchorNode = null; + #anchorOffset = 0; + #boxes; + #clipPathId = null; + #colorPicker = null; + #focusOutlines = null; + #focusNode = null; + #focusOffset = 0; + #highlightDiv = null; + #highlightOutlines = null; + #id = null; + #isFreeHighlight = false; + #firstPoint = null; + #lastPoint = null; + #outlineId = null; + #text = ""; + #thickness; + #methodOfCreation = ""; + static _defaultColor = null; + static _defaultOpacity = 1; + static _defaultThickness = 12; + static _type = "highlight"; + static _editorType = AnnotationEditorType.HIGHLIGHT; + static _freeHighlightId = -1; + static _freeHighlight = null; + static _freeHighlightClipId = ""; + static get _keyboardManager() { + const proto = HighlightEditor.prototype; + return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, { + args: [0] + }], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, { + args: [1] + }], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, { + args: [2] + }], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, { + args: [3] + }]])); + } + constructor(params) { + super({ + ...params, + name: "highlightEditor" + }); + this.color = params.color || HighlightEditor._defaultColor; + this.#thickness = params.thickness || HighlightEditor._defaultThickness; + this.opacity = params.opacity || HighlightEditor._defaultOpacity; + this.#boxes = params.boxes || null; + this.#methodOfCreation = params.methodOfCreation || ""; + this.#text = params.text || ""; + this._isDraggable = false; + this.defaultL10nId = "pdfjs-editor-highlight-editor"; + if (params.highlightId > -1) { + this.#isFreeHighlight = true; + this.#createFreeOutlines(params); + this.#addToDrawLayer(); + } else if (this.#boxes) { + this.#anchorNode = params.anchorNode; + this.#anchorOffset = params.anchorOffset; + this.#focusNode = params.focusNode; + this.#focusOffset = params.focusOffset; + this.#createOutlines(); + this.#addToDrawLayer(); + this.rotate(this.rotation); + } + if (!this.annotationElementId) { + this._uiManager.a11yAlert("pdfjs-editor-highlight-added-alert"); + } + } + get telemetryInitialData() { + return { + action: "added", + type: this.#isFreeHighlight ? "free_highlight" : "highlight", + color: this._uiManager.getNonHCMColorName(this.color), + thickness: this.#thickness, + methodOfCreation: this.#methodOfCreation + }; + } + get telemetryFinalData() { + return { + type: "highlight", + color: this._uiManager.getNonHCMColorName(this.color) + }; + } + static computeTelemetryFinalData(data) { + return { + numberOfColors: data.get("color").size + }; + } + #createOutlines() { + const outliner = new HighlightOutliner(this.#boxes, 0.001); + this.#highlightOutlines = outliner.getOutlines(); + [this.x, this.y, this.width, this.height] = this.#highlightOutlines.box; + const outlinerForOutline = new HighlightOutliner(this.#boxes, 0.0025, 0.001, this._uiManager.direction === "ltr"); + this.#focusOutlines = outlinerForOutline.getOutlines(); + const { + firstPoint + } = this.#highlightOutlines; + this.#firstPoint = [(firstPoint[0] - this.x) / this.width, (firstPoint[1] - this.y) / this.height]; + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]; + } + #createFreeOutlines({ + highlightOutlines, + highlightId, + clipPathId + }) { + this.#highlightOutlines = highlightOutlines; + const extraThickness = 1.5; + this.#focusOutlines = highlightOutlines.getNewOutline(this.#thickness / 2 + extraThickness, 0.0025); + if (highlightId >= 0) { + this.#id = highlightId; + this.#clipPathId = clipPathId; + this.parent.drawLayer.finalizeDraw(highlightId, { + bbox: highlightOutlines.box, + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.#outlineId = this.parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: true + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, true); + } else if (this.parent) { + const angle = this.parent.viewport.rotation; + this.parent.drawLayer.updateProperties(this.#id, { + bbox: HighlightEditor.#rotateBbox(this.#highlightOutlines.box, (angle - this.rotation + 360) % 360), + path: { + d: highlightOutlines.toSVGPath() + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + path: { + d: this.#focusOutlines.toSVGPath() + } + }); + } + const [x, y, width, height] = highlightOutlines.box; + switch (this.rotation) { + case 0: + this.x = x; + this.y = y; + this.width = width; + this.height = height; + break; + case 90: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = y; + this.y = 1 - x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + case 180: + this.x = 1 - x; + this.y = 1 - y; + this.width = width; + this.height = height; + break; + case 270: + { + const [pageWidth, pageHeight] = this.parentDimensions; + this.x = 1 - y; + this.y = x; + this.width = width * pageHeight / pageWidth; + this.height = height * pageWidth / pageHeight; + break; + } + } + const { + firstPoint + } = highlightOutlines; + this.#firstPoint = [(firstPoint[0] - x) / width, (firstPoint[1] - y) / height]; + const { + lastPoint + } = this.#focusOutlines; + this.#lastPoint = [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + HighlightEditor._defaultColor ||= uiManager.highlightColors?.values().next().value || "#fff066"; + } + static updateDefaultParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + HighlightEditor._defaultColor = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + HighlightEditor._defaultThickness = value; + break; + } + } + translateInPage(x, y) {} + get toolbarPosition() { + return this.#lastPoint; + } + get commentButtonPosition() { + return this.#firstPoint; + } + updateParams(type, value) { + switch (type) { + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + this.#updateColor(value); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + this.#updateThickness(value); + break; + } + } + static get defaultPropertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, HighlightEditor._defaultThickness]]; + } + get propertiesToUpdate() { + return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, this.#thickness || HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, this.#isFreeHighlight]]; + } + onUpdatedColor() { + this.parent?.drawLayer.updateProperties(this.#id, { + root: { + fill: this.color, + "fill-opacity": this.opacity + } + }); + this.#colorPicker?.updateColor(this.color); + super.onUpdatedColor(); + } + #updateColor(color) { + const setColorAndOpacity = (col, opa) => { + this.color = col; + this.opacity = opa; + this.onUpdatedColor(); + }; + const savedColor = this.color; + const savedOpacity = this.opacity; + this.addCommands({ + cmd: setColorAndOpacity.bind(this, color, HighlightEditor._defaultOpacity), + undo: setColorAndOpacity.bind(this, savedColor, savedOpacity), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.HIGHLIGHT_COLOR, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "color_changed", + color: this._uiManager.getNonHCMColorName(color) + }, true); + } + #updateThickness(thickness) { + const savedThickness = this.#thickness; + const setThickness = th => { + this.#thickness = th; + this.#changeThickness(th); + }; + this.addCommands({ + cmd: setThickness.bind(this, thickness), + undo: setThickness.bind(this, savedThickness), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type: AnnotationEditorParamsType.INK_THICKNESS, + overwriteIfSameType: true, + keepUndo: true + }); + this._reportTelemetry({ + action: "thickness_changed", + thickness + }, true); + } + get toolbarButtons() { + if (this._uiManager.highlightColors) { + const colorPicker = this.#colorPicker = new ColorPicker({ + editor: this + }); + return [["colorPicker", colorPicker]]; + } + return super.toolbarButtons; + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + fixAndSetPosition() { + return super.fixAndSetPosition(this.#getRotation()); + } + getBaseTranslation() { + return [0, 0]; + } + getRect(tx, ty) { + return super.getRect(tx, ty, this.#getRotation()); + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + if (focus) { + this.div.focus(); + } + } + remove() { + this.#cleanDrawLayer(); + this._reportTelemetry({ + action: "deleted" + }); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this.#cleanDrawLayer(); + } else if (parent) { + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + this.show(this._isVisible); + if (mustBeSelected) { + this.select(); + } + } + #changeThickness(thickness) { + if (!this.#isFreeHighlight) { + return; + } + this.#createFreeOutlines({ + highlightOutlines: this.#highlightOutlines.getNewOutline(thickness / 2) + }); + this.fixAndSetPosition(); + this.setDims(this.width, this.height); + } + #cleanDrawLayer() { + if (this.#id === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this.#id); + this.#id = null; + this.parent.drawLayer.remove(this.#outlineId); + this.#outlineId = null; + } + #addToDrawLayer(parent = this.parent) { + if (this.#id !== null) { + return; + } + ({ + id: this.#id, + clipPathId: this.#clipPathId + } = parent.drawLayer.draw({ + bbox: this.#highlightOutlines.box, + root: { + viewBox: "0 0 1 1", + fill: this.color, + "fill-opacity": this.opacity + }, + rootClass: { + highlight: true, + free: this.#isFreeHighlight + }, + path: { + d: this.#highlightOutlines.toSVGPath() + } + }, false, true)); + this.#outlineId = parent.drawLayer.drawOutline({ + rootClass: { + highlightOutline: true, + free: this.#isFreeHighlight + }, + bbox: this.#focusOutlines.box, + path: { + d: this.#focusOutlines.toSVGPath() + } + }, this.#isFreeHighlight); + if (this.#highlightDiv) { + this.#highlightDiv.style.clipPath = this.#clipPathId; + } + } + static #rotateBbox([x, y, width, height], angle) { + switch (angle) { + case 90: + return [1 - y - height, x, height, width]; + case 180: + return [1 - x - width, 1 - y - height, width, height]; + case 270: + return [y, 1 - x - width, height, width]; + } + return [x, y, width, height]; + } + rotate(angle) { + const { + drawLayer + } = this.parent; + let box; + if (this.#isFreeHighlight) { + angle = (angle - this.rotation + 360) % 360; + box = HighlightEditor.#rotateBbox(this.#highlightOutlines.box, angle); + } else { + box = HighlightEditor.#rotateBbox([this.x, this.y, this.width, this.height], angle); + } + drawLayer.updateProperties(this.#id, { + bbox: box, + root: { + "data-main-rotation": angle + } + }); + drawLayer.updateProperties(this.#outlineId, { + bbox: HighlightEditor.#rotateBbox(this.#focusOutlines.box, angle), + root: { + "data-main-rotation": angle + } + }); + } + render() { + if (this.div) { + return this.div; + } + const div = super.render(); + if (this.#text) { + div.setAttribute("aria-label", this.#text); + div.setAttribute("role", "mark"); + } + if (this.#isFreeHighlight) { + div.classList.add("free"); + } else { + this.div.addEventListener("keydown", this.#keydown.bind(this), { + signal: this._uiManager._signal + }); + } + const highlightDiv = this.#highlightDiv = document.createElement("div"); + div.append(highlightDiv); + highlightDiv.setAttribute("aria-hidden", "true"); + highlightDiv.className = "internal"; + highlightDiv.style.clipPath = this.#clipPathId; + this.setDims(this.width, this.height); + bindEvents(this, this.#highlightDiv, ["pointerover", "pointerleave"]); + this.enableEditing(); + return div; + } + pointerover() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: true + } + }); + } + } + pointerleave() { + if (!this.isSelected) { + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false + } + }); + } + } + #keydown(event) { + HighlightEditor._keyboardManager.exec(this, event); + } + _moveCaret(direction) { + this.parent.unselect(this); + switch (direction) { + case 0: + case 2: + this.#setCaret(true); + break; + case 1: + case 3: + this.#setCaret(false); + break; + } + } + #setCaret(start) { + if (!this.#anchorNode) { + return; + } + const selection = window.getSelection(); + if (start) { + selection.setPosition(this.#anchorNode, this.#anchorOffset); + } else { + selection.setPosition(this.#focusNode, this.#focusOffset); + } + } + select() { + super.select(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hovered: false, + selected: true + } + }); + } + unselect() { + super.unselect(); + if (!this.#outlineId) { + return; + } + this.parent?.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + selected: false + } + }); + if (!this.#isFreeHighlight) { + this.#setCaret(false); + } + } + get _mustFixPosition() { + return !this.#isFreeHighlight; + } + show(visible = this._isVisible) { + super.show(visible); + if (this.parent) { + this.parent.drawLayer.updateProperties(this.#id, { + rootClass: { + hidden: !visible + } + }); + this.parent.drawLayer.updateProperties(this.#outlineId, { + rootClass: { + hidden: !visible + } + }); + } + } + #getRotation() { + return this.#isFreeHighlight ? this.rotation : 0; + } + #serializeBoxes() { + if (this.#isFreeHighlight) { + return null; + } + const [pageWidth, pageHeight] = this.pageDimensions; + const [pageX, pageY] = this.pageTranslation; + const boxes = this.#boxes; + const quadPoints = new Float32Array(boxes.length * 8); + let i = 0; + for (const { + x, + y, + width, + height + } of boxes) { + const sx = x * pageWidth + pageX; + const sy = (1 - y) * pageHeight + pageY; + quadPoints[i] = quadPoints[i + 4] = sx; + quadPoints[i + 1] = quadPoints[i + 3] = sy; + quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth; + quadPoints[i + 5] = quadPoints[i + 7] = sy - height * pageHeight; + i += 8; + } + return quadPoints; + } + #serializeOutlines(rect) { + return this.#highlightOutlines.serialize(rect, this.#getRotation()); + } + static startHighlighting(parent, isLTR, { + target: textLayer, + x, + y + }) { + const { + x: layerX, + y: layerY, + width: parentWidth, + height: parentHeight + } = textLayer.getBoundingClientRect(); + const ac = new AbortController(); + const signal = parent.combinedSignal(ac); + const pointerUpCallback = e => { + ac.abort(); + this.#endHighlight(parent, e); + }; + window.addEventListener("blur", pointerUpCallback, { + signal + }); + window.addEventListener("pointerup", pointerUpCallback, { + signal + }); + window.addEventListener("pointerdown", stopEvent, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + textLayer.addEventListener("pointermove", this.#highlightMove.bind(this, parent), { + signal + }); + this._freeHighlight = new FreeHighlightOutliner({ + x, + y + }, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 0.001); + ({ + id: this._freeHighlightId, + clipPathId: this._freeHighlightClipId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: this._defaultColor, + "fill-opacity": this._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: this._freeHighlight.toSVGPath() + } + }, true, true)); + } + static #highlightMove(parent, event) { + if (this._freeHighlight.add(event)) { + parent.drawLayer.updateProperties(this._freeHighlightId, { + path: { + d: this._freeHighlight.toSVGPath() + } + }); + } + } + static #endHighlight(parent, event) { + if (!this._freeHighlight.isEmpty()) { + parent.createAndAddNewEditor(event, false, { + highlightId: this._freeHighlightId, + highlightOutlines: this._freeHighlight.getOutlines(), + clipPathId: this._freeHighlightClipId, + methodOfCreation: "main_toolbar" + }); + } else { + parent.drawLayer.remove(this._freeHighlightId); + } + this._freeHighlightId = -1; + this._freeHighlight = null; + this._freeHighlightClipId = ""; + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof HighlightAnnotationElement) { + const { + data: { + quadPoints, + rect, + rotation, + id, + color, + opacity, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + opacity, + quadPoints, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } else if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.HIGHLIGHT, + color: Array.from(color), + thickness, + inkLists, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const { + color, + quadPoints, + inkLists, + opacity + } = data; + const editor = await super.deserialize(data, parent, uiManager); + editor.color = Util.makeHexColor(...color); + editor.opacity = opacity || 1; + if (inkLists) { + editor.#thickness = data.thickness; + } + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + const [pageWidth, pageHeight] = editor.pageDimensions; + const [pageX, pageY] = editor.pageTranslation; + if (quadPoints) { + const boxes = editor.#boxes = []; + for (let i = 0; i < quadPoints.length; i += 8) { + boxes.push({ + x: (quadPoints[i] - pageX) / pageWidth, + y: 1 - (quadPoints[i + 1] - pageY) / pageHeight, + width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth, + height: (quadPoints[i + 1] - quadPoints[i + 5]) / pageHeight + }); + } + editor.#createOutlines(); + editor.#addToDrawLayer(); + editor.rotate(editor.rotation); + } else if (inkLists) { + editor.#isFreeHighlight = true; + const points = inkLists[0]; + const point = { + x: points[0] - pageX, + y: pageHeight - (points[1] - pageY) + }; + const outliner = new FreeHighlightOutliner(point, [0, 0, pageWidth, pageHeight], 1, editor.#thickness / 2, true, 0.001); + for (let i = 0, ii = points.length; i < ii; i += 2) { + point.x = points[i] - pageX; + point.y = pageHeight - (points[i + 1] - pageY); + outliner.add(point); + } + const { + id, + clipPathId + } = parent.drawLayer.draw({ + bbox: [0, 0, 1, 1], + root: { + viewBox: "0 0 1 1", + fill: editor.color, + "fill-opacity": editor._defaultOpacity + }, + rootClass: { + highlight: true, + free: true + }, + path: { + d: outliner.toSVGPath() + } + }, true, true); + editor.#createFreeOutlines({ + highlightOutlines: outliner.getOutlines(), + highlightId: id, + clipPathId + }); + editor.#addToDrawLayer(); + editor.rotate(editor.parentRotation); + } + return editor; + } + serialize(isForCopying = false) { + if (this.isEmpty() || isForCopying) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const color = AnnotationEditor._colorManager.convert(this._uiManager.getNonHCMColor(this.color)); + const serialized = super.serialize(isForCopying); + Object.assign(serialized, { + color, + opacity: this.opacity, + thickness: this.#thickness, + quadPoints: this.#serializeBoxes(), + outlines: this.#serializeOutlines(serialized.rect) + }); + this.addComment(serialized); + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color + } = this._initialData; + return this.hasEditedComment || serialized.color.some((c, i) => c !== color[i]); + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/draw.js + + + +class DrawingOptions { + #svgProperties = Object.create(null); + updateProperty(name, value) { + this[name] = value; + this.updateSVGProperty(name, value); + } + updateProperties(properties) { + if (!properties) { + return; + } + for (const [name, value] of Object.entries(properties)) { + if (!name.startsWith("_")) { + this.updateProperty(name, value); + } + } + } + updateSVGProperty(name, value) { + this.#svgProperties[name] = value; + } + toSVGProperties() { + const root = this.#svgProperties; + this.#svgProperties = Object.create(null); + return { + root + }; + } + reset() { + this.#svgProperties = Object.create(null); + } + updateAll(options = this) { + this.updateProperties(options); + } + clone() { + unreachable("Not implemented"); + } +} +class DrawingEditor extends AnnotationEditor { + #drawOutlines = null; + #mustBeCommitted; + _colorPicker = null; + _drawId = null; + static _currentDrawId = -1; + static _currentParent = null; + static #currentDraw = null; + static #currentDrawingAC = null; + static #currentDrawingOptions = null; + static #currentPointerId = NaN; + static #currentPointerType = null; + static #currentPointerIds = null; + static #currentMoveTimestamp = NaN; + static _INNER_MARGIN = 3; + constructor(params) { + super(params); + this.#mustBeCommitted = params.mustBeCommitted || false; + this._addOutlines(params); + } + onUpdatedColor() { + this._colorPicker?.update(this.color); + super.onUpdatedColor(); + } + _addOutlines(params) { + if (params.drawOutlines) { + this.#createDrawOutlines(params); + this.#addToDrawLayer(); + } + } + #createDrawOutlines({ + drawOutlines, + drawId, + drawingOptions + }) { + this.#drawOutlines = drawOutlines; + this._drawingOptions ||= drawingOptions; + if (!this.annotationElementId) { + this._uiManager.a11yAlert(`pdfjs-editor-${this.editorType}-added-alert`); + } + if (drawId >= 0) { + this._drawId = drawId; + this.parent.drawLayer.finalizeDraw(drawId, drawOutlines.defaultProperties); + } else { + this._drawId = this.#createDrawing(drawOutlines, this.parent); + } + this.#updateBbox(drawOutlines.box); + } + #createDrawing(drawOutlines, parent) { + const { + id + } = parent.drawLayer.draw(DrawingEditor._mergeSVGProperties(this._drawingOptions.toSVGProperties(), drawOutlines.defaultSVGProperties), false, false); + return id; + } + static _mergeSVGProperties(p1, p2) { + const p1Keys = new Set(Object.keys(p1)); + for (const [key, value] of Object.entries(p2)) { + if (p1Keys.has(key)) { + Object.assign(p1[key], value); + } else { + p1[key] = value; + } + } + return p1; + } + static getDefaultDrawingOptions(_options) { + unreachable("Not implemented"); + } + static get typesMap() { + unreachable("Not implemented"); + } + static get isDrawer() { + return true; + } + static get supportMultipleDrawings() { + return false; + } + static updateDefaultParams(type, value) { + const propertyName = this.typesMap.get(type); + if (propertyName) { + this._defaultDrawingOptions.updateProperty(propertyName, value); + } + if (this._currentParent) { + DrawingEditor.#currentDraw.updateProperty(propertyName, value); + this._currentParent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + } + updateParams(type, value) { + const propertyName = this.constructor.typesMap.get(type); + if (propertyName) { + this._updateProperty(type, propertyName, value); + } + } + static get defaultPropertiesToUpdate() { + const properties = []; + const options = this._defaultDrawingOptions; + for (const [type, name] of this.typesMap) { + properties.push([type, options[name]]); + } + return properties; + } + get propertiesToUpdate() { + const properties = []; + const { + _drawingOptions + } = this; + for (const [type, name] of this.constructor.typesMap) { + properties.push([type, _drawingOptions[name]]); + } + return properties; + } + _updateProperty(type, name, value) { + const options = this._drawingOptions; + const savedValue = options[name]; + const setter = val => { + options.updateProperty(name, val); + const bbox = this.#drawOutlines.updateProperty(name, val); + if (bbox) { + this.#updateBbox(bbox); + } + this.parent?.drawLayer.updateProperties(this._drawId, options.toSVGProperties()); + if (type === this.colorType) { + this.onUpdatedColor(); + } + }; + this.addCommands({ + cmd: setter.bind(this, value), + undo: setter.bind(this, savedValue), + post: this._uiManager.updateUI.bind(this._uiManager, this), + mustExec: true, + type, + overwriteIfSameType: true, + keepUndo: true + }); + } + _onResizing() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizingSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onResized() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathResizedSVGProperties(this.#convertToDrawSpace()), { + bbox: this.#rotateBox() + })); + } + _onTranslating(_x, _y) { + this.parent?.drawLayer.updateProperties(this._drawId, { + bbox: this.#rotateBox() + }); + } + _onTranslated() { + this.parent?.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties(this.#drawOutlines.getPathTranslatedSVGProperties(this.#convertToDrawSpace(), this.parentDimensions), { + bbox: this.#rotateBox() + })); + } + _onStartDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: true + } + }); + } + _onStopDragging() { + this.parent?.drawLayer.updateProperties(this._drawId, { + rootClass: { + moving: false + } + }); + } + commit() { + super.commit(); + this.disableEditMode(); + this.disableEditing(); + } + disableEditing() { + super.disableEditing(); + this.div.classList.toggle("disabled", true); + } + enableEditing() { + super.enableEditing(); + this.div.classList.toggle("disabled", false); + } + getBaseTranslation() { + return [0, 0]; + } + get isResizable() { + return true; + } + onceAdded(focus) { + if (!this.annotationElementId) { + this.parent.addUndoableEditor(this); + } + this._isDraggable = true; + if (this.#mustBeCommitted) { + this.#mustBeCommitted = false; + this.commit(); + this.parent.setSelected(this); + if (focus && this.isOnScreen) { + this.div.focus(); + } + } + } + remove() { + this.#cleanDrawLayer(); + super.remove(); + } + rebuild() { + if (!this.parent) { + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + this.#addToDrawLayer(); + this.#updateBbox(this.#drawOutlines.box); + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + setParent(parent) { + let mustBeSelected = false; + if (this.parent && !parent) { + this._uiManager.removeShouldRescale(this); + this.#cleanDrawLayer(); + } else if (parent) { + this._uiManager.addShouldRescale(this); + this.#addToDrawLayer(parent); + mustBeSelected = !this.parent && this.div?.classList.contains("selectedEditor"); + } + super.setParent(parent); + if (mustBeSelected) { + this.select(); + } + } + #cleanDrawLayer() { + if (this._drawId === null || !this.parent) { + return; + } + this.parent.drawLayer.remove(this._drawId); + this._drawId = null; + this._drawingOptions.reset(); + } + #addToDrawLayer(parent = this.parent) { + if (this._drawId !== null && this.parent === parent) { + return; + } + if (this._drawId !== null) { + this.parent.drawLayer.updateParent(this._drawId, parent.drawLayer); + return; + } + this._drawingOptions.updateAll(); + this._drawId = this.#createDrawing(this.#drawOutlines, parent); + } + #convertToParentSpace([x, y, width, height]) { + const { + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [y, 1 - x, width * (pH / pW), height * (pW / pH)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [1 - y, x, width * (pH / pW), height * (pW / pH)]; + default: + return [x, y, width, height]; + } + } + #convertToDrawSpace() { + const { + x, + y, + width, + height, + parentDimensions: [pW, pH], + rotation + } = this; + switch (rotation) { + case 90: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 180: + return [1 - x, 1 - y, width, height]; + case 270: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + #updateBbox(bbox) { + [this.x, this.y, this.width, this.height] = this.#convertToParentSpace(bbox); + if (this.div) { + this.fixAndSetPosition(); + this.setDims(); + } + this._onResized(); + } + #rotateBox() { + const { + x, + y, + width, + height, + rotation, + parentRotation, + parentDimensions: [pW, pH] + } = this; + switch ((rotation * 4 + parentRotation) / 90) { + case 1: + return [1 - y - height, x, height, width]; + case 2: + return [1 - x - width, 1 - y - height, width, height]; + case 3: + return [y, 1 - x - width, height, width]; + case 4: + return [x, y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 5: + return [1 - y, x, width * (pW / pH), height * (pH / pW)]; + case 6: + return [1 - x - height * (pH / pW), 1 - y, height * (pH / pW), width * (pW / pH)]; + case 7: + return [y - width * (pW / pH), 1 - x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 8: + return [x - width, y - height, width, height]; + case 9: + return [1 - y, x - width, height, width]; + case 10: + return [1 - x, 1 - y, width, height]; + case 11: + return [y - height, 1 - x, height, width]; + case 12: + return [x - height * (pH / pW), y, height * (pH / pW), width * (pW / pH)]; + case 13: + return [1 - y - width * (pW / pH), x - height * (pH / pW), width * (pW / pH), height * (pH / pW)]; + case 14: + return [1 - x, 1 - y - width * (pW / pH), height * (pH / pW), width * (pW / pH)]; + case 15: + return [y, 1 - x, width * (pW / pH), height * (pH / pW)]; + default: + return [x, y, width, height]; + } + } + rotate() { + if (!this.parent) { + return; + } + this.parent.drawLayer.updateProperties(this._drawId, DrawingEditor._mergeSVGProperties({ + bbox: this.#rotateBox() + }, this.#drawOutlines.updateRotation((this.parentRotation - this.rotation + 360) % 360))); + } + onScaleChanging() { + if (!this.parent) { + return; + } + this.#updateBbox(this.#drawOutlines.updateParentDimensions(this.parentDimensions, this.parent.scale)); + } + static onScaleChangingWhenDrawing() {} + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + const div = super.render(); + div.classList.add("draw"); + const drawDiv = document.createElement("div"); + div.append(drawDiv); + drawDiv.setAttribute("aria-hidden", "true"); + drawDiv.className = "internal"; + this.setDims(); + this._uiManager.addShouldRescale(this); + this.disableEditing(); + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + return div; + } + static createDrawerInstance(_x, _y, _parentWidth, _parentHeight, _rotation) { + unreachable("Not implemented"); + } + static startDrawing(parent, uiManager, _isLTR, event) { + const { + target, + offsetX: x, + offsetY: y, + pointerId, + pointerType + } = event; + if (DrawingEditor.#currentPointerType && DrawingEditor.#currentPointerType !== pointerType) { + return; + } + const { + viewport: { + rotation + } + } = parent; + const { + width: parentWidth, + height: parentHeight + } = target.getBoundingClientRect(); + const ac = DrawingEditor.#currentDrawingAC = new AbortController(); + const signal = parent.combinedSignal(ac); + DrawingEditor.#currentPointerId ||= pointerId; + DrawingEditor.#currentPointerType ??= pointerType; + window.addEventListener("pointerup", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._endDraw(e); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointercancel", e => { + if (DrawingEditor.#currentPointerId === e.pointerId) { + this._currentParent.endDrawingSession(); + } else { + DrawingEditor.#currentPointerIds?.delete(e.pointerId); + } + }, { + signal + }); + window.addEventListener("pointerdown", e => { + if (DrawingEditor.#currentPointerType !== e.pointerType) { + return; + } + (DrawingEditor.#currentPointerIds ||= new Set()).add(e.pointerId); + if (DrawingEditor.#currentDraw.isCancellable()) { + DrawingEditor.#currentDraw.removeLastElement(); + if (DrawingEditor.#currentDraw.isEmpty()) { + this._currentParent.endDrawingSession(true); + } else { + this._endDraw(null); + } + } + }, { + capture: true, + passive: false, + signal + }); + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + target.addEventListener("pointermove", this._drawMove.bind(this), { + signal + }); + target.addEventListener("touchmove", e => { + if (e.timeStamp === DrawingEditor.#currentMoveTimestamp) { + stopEvent(e); + } + }, { + signal + }); + parent.toggleDrawing(); + uiManager._editorUndoBar?.hide(); + if (DrawingEditor.#currentDraw) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.startNew(x, y, parentWidth, parentHeight, rotation)); + return; + } + uiManager.updateUIForDefaultProperties(this); + DrawingEditor.#currentDraw = this.createDrawerInstance(x, y, parentWidth, parentHeight, rotation); + DrawingEditor.#currentDrawingOptions = this.getDefaultDrawingOptions(); + this._currentParent = parent; + ({ + id: this._currentDrawId + } = parent.drawLayer.draw(this._mergeSVGProperties(DrawingEditor.#currentDrawingOptions.toSVGProperties(), DrawingEditor.#currentDraw.defaultSVGProperties), true, false)); + } + static _drawMove(event) { + DrawingEditor.#currentMoveTimestamp = -1; + if (!DrawingEditor.#currentDraw) { + return; + } + const { + offsetX, + offsetY, + pointerId + } = event; + if (DrawingEditor.#currentPointerId !== pointerId) { + return; + } + if (DrawingEditor.#currentPointerIds?.size >= 1) { + this._endDraw(event); + return; + } + this._currentParent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.add(offsetX, offsetY)); + DrawingEditor.#currentMoveTimestamp = event.timeStamp; + stopEvent(event); + } + static _cleanup(all) { + if (all) { + this._currentDrawId = -1; + this._currentParent = null; + DrawingEditor.#currentDraw = null; + DrawingEditor.#currentDrawingOptions = null; + DrawingEditor.#currentPointerType = null; + DrawingEditor.#currentMoveTimestamp = NaN; + } + if (DrawingEditor.#currentDrawingAC) { + DrawingEditor.#currentDrawingAC.abort(); + DrawingEditor.#currentDrawingAC = null; + DrawingEditor.#currentPointerId = NaN; + DrawingEditor.#currentPointerIds = null; + } + } + static _endDraw(event) { + const parent = this._currentParent; + if (!parent) { + return; + } + parent.toggleDrawing(true); + this._cleanup(false); + if (event?.target === parent.div) { + parent.drawLayer.updateProperties(this._currentDrawId, DrawingEditor.#currentDraw.end(event.offsetX, event.offsetY)); + } + if (this.supportMultipleDrawings) { + const draw = DrawingEditor.#currentDraw; + const drawId = this._currentDrawId; + const lastElement = draw.getLastElement(); + parent.addCommands({ + cmd: () => { + parent.drawLayer.updateProperties(drawId, draw.setLastElement(lastElement)); + }, + undo: () => { + parent.drawLayer.updateProperties(drawId, draw.removeLastElement()); + }, + mustExec: false, + type: AnnotationEditorParamsType.DRAW_STEP + }); + return; + } + this.endDrawing(false); + } + static endDrawing(isAborted) { + const parent = this._currentParent; + if (!parent) { + return null; + } + parent.toggleDrawing(true); + parent.cleanUndoStack(AnnotationEditorParamsType.DRAW_STEP); + if (!DrawingEditor.#currentDraw.isEmpty()) { + const { + pageDimensions: [pageWidth, pageHeight], + scale + } = parent; + const editor = parent.createAndAddNewEditor({ + offsetX: 0, + offsetY: 0 + }, false, { + drawId: this._currentDrawId, + drawOutlines: DrawingEditor.#currentDraw.getOutlines(pageWidth * scale, pageHeight * scale, scale, this._INNER_MARGIN), + drawingOptions: DrawingEditor.#currentDrawingOptions, + mustBeCommitted: !isAborted + }); + this._cleanup(true); + return editor; + } + parent.drawLayer.remove(this._currentDrawId); + this._cleanup(true); + return null; + } + createDrawingOptions(_data) {} + static deserializeDraw(_pageX, _pageY, _pageWidth, _pageHeight, _innerWidth, _data) { + unreachable("Not implemented"); + } + static async deserialize(data, parent, uiManager) { + const { + rawDims: { + pageWidth, + pageHeight, + pageX, + pageY + } + } = parent.viewport; + const drawOutlines = this.deserializeDraw(pageX, pageY, pageWidth, pageHeight, this._INNER_MARGIN, data); + const editor = await super.deserialize(data, parent, uiManager); + editor.createDrawingOptions(data); + editor.#createDrawOutlines({ + drawOutlines + }); + editor.#addToDrawLayer(); + editor.onScaleChanging(); + editor.rotate(); + return editor; + } + serializeDraw(isForCopying) { + const [pageX, pageY] = this.pageTranslation; + const [pageWidth, pageHeight] = this.pageDimensions; + return this.#drawOutlines.serialize([pageX, pageY, pageWidth, pageHeight], isForCopying); + } + renderAnnotationElement(annotation) { + annotation.updateEdited({ + rect: this.getPDFRect() + }); + return null; + } + static canCreateNewEmptyEditor() { + return false; + } +} + +;// ./src/display/editor/drawers/inkdraw.js + + +class InkDrawOutliner { + #last = new Float64Array(6); + #line; + #lines; + #rotation; + #thickness; + #points; + #lastSVGPath = ""; + #lastIndex = 0; + #outlines = new InkDrawOutline(); + #parentWidth; + #parentHeight; + constructor(x, y, parentWidth, parentHeight, rotation, thickness) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + this.#thickness = thickness; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + this.#lines = [{ + line, + points: this.#points + }]; + this.#last.set(line, 0); + } + updateProperty(name, value) { + if (name === "stroke-width") { + this.#thickness = value; + } + } + #normalizePoint(x, y) { + return Outline._normalizePoint(x, y, this.#parentWidth, this.#parentHeight, this.#rotation); + } + isEmpty() { + return !this.#lines || this.#lines.length === 0; + } + isCancellable() { + return this.#points.length <= 10; + } + add(x, y) { + [x, y] = this.#normalizePoint(x, y); + const [x1, y1, x2, y2] = this.#last.subarray(2, 6); + const diffX = x - x2; + const diffY = y - y2; + const d = Math.hypot(this.#parentWidth * diffX, this.#parentHeight * diffY); + if (d <= 2) { + return null; + } + this.#points.push(x, y); + if (isNaN(x1)) { + this.#last.set([x2, y2, x, y], 2); + this.#line.push(NaN, NaN, NaN, NaN, x, y); + return { + path: { + d: this.toSVGPath() + } + }; + } + if (isNaN(this.#last[0])) { + this.#line.splice(6, 6); + } + this.#last.set([x1, y1, x2, y2, x, y], 0); + this.#line.push(...Outline.createBezierPoints(x1, y1, x2, y2, x, y)); + return { + path: { + d: this.toSVGPath() + } + }; + } + end(x, y) { + const change = this.add(x, y); + if (change) { + return change; + } + if (this.#points.length === 2) { + return { + path: { + d: this.toSVGPath() + } + }; + } + return null; + } + startNew(x, y, parentWidth, parentHeight, rotation) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#rotation = rotation; + [x, y] = this.#normalizePoint(x, y); + const line = this.#line = [NaN, NaN, NaN, NaN, x, y]; + this.#points = [x, y]; + const last = this.#lines.at(-1); + if (last) { + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + } + this.#lines.push({ + line, + points: this.#points + }); + this.#last.set(line, 0); + this.#lastIndex = 0; + this.toSVGPath(); + return null; + } + getLastElement() { + return this.#lines.at(-1); + } + setLastElement(element) { + if (!this.#lines) { + return this.#outlines.setLastElement(element); + } + this.#lines.push(element); + this.#line = element.line; + this.#points = element.points; + this.#lastIndex = 0; + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + if (!this.#lines) { + return this.#outlines.removeLastElement(); + } + this.#lines.pop(); + this.#lastSVGPath = ""; + for (let i = 0, ii = this.#lines.length; i < ii; i++) { + const { + line, + points + } = this.#lines[i]; + this.#line = line; + this.#points = points; + this.#lastIndex = 0; + this.toSVGPath(); + } + return { + path: { + d: this.#lastSVGPath + } + }; + } + toSVGPath() { + const firstX = Outline.svgRound(this.#line[4]); + const firstY = Outline.svgRound(this.#line[5]); + if (this.#points.length === 2) { + this.#lastSVGPath = `${this.#lastSVGPath} M ${firstX} ${firstY} Z`; + return this.#lastSVGPath; + } + if (this.#points.length <= 6) { + const i = this.#lastSVGPath.lastIndexOf("M"); + this.#lastSVGPath = `${this.#lastSVGPath.slice(0, i)} M ${firstX} ${firstY}`; + this.#lastIndex = 6; + } + if (this.#points.length === 4) { + const secondX = Outline.svgRound(this.#line[10]); + const secondY = Outline.svgRound(this.#line[11]); + this.#lastSVGPath = `${this.#lastSVGPath} L ${secondX} ${secondY}`; + this.#lastIndex = 12; + return this.#lastSVGPath; + } + const buffer = []; + if (this.#lastIndex === 0) { + buffer.push(`M ${firstX} ${firstY}`); + this.#lastIndex = 6; + } + for (let i = this.#lastIndex, ii = this.#line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = this.#line.slice(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + this.#lastSVGPath += buffer.join(" "); + this.#lastIndex = this.#line.length; + return this.#lastSVGPath; + } + getOutlines(parentWidth, parentHeight, scale, innerMargin) { + const last = this.#lines.at(-1); + last.line = new Float32Array(last.line); + last.points = new Float32Array(last.points); + this.#outlines.build(this.#lines, parentWidth, parentHeight, scale, this.#rotation, this.#thickness, innerMargin); + this.#last = null; + this.#line = null; + this.#lines = null; + this.#lastSVGPath = null; + return this.#outlines; + } + get defaultSVGProperties() { + return { + root: { + viewBox: "0 0 10000 10000" + }, + rootClass: { + draw: true + }, + bbox: [0, 0, 1, 1] + }; + } +} +class InkDrawOutline extends Outline { + #bbox; + #currentRotation = 0; + #innerMargin; + #lines; + #parentWidth; + #parentHeight; + #parentScale; + #rotation; + #thickness; + build(lines, parentWidth, parentHeight, parentScale, rotation, thickness, innerMargin) { + this.#parentWidth = parentWidth; + this.#parentHeight = parentHeight; + this.#parentScale = parentScale; + this.#rotation = rotation; + this.#thickness = thickness; + this.#innerMargin = innerMargin ?? 0; + this.#lines = lines; + this.#computeBbox(); + } + get thickness() { + return this.#thickness; + } + setLastElement(element) { + this.#lines.push(element); + return { + path: { + d: this.toSVGPath() + } + }; + } + removeLastElement() { + this.#lines.pop(); + return { + path: { + d: this.toSVGPath() + } + }; + } + toSVGPath() { + const buffer = []; + for (const { + line + } of this.#lines) { + buffer.push(`M${Outline.svgRound(line[4])} ${Outline.svgRound(line[5])}`); + if (line.length === 6) { + buffer.push("Z"); + continue; + } + if (line.length === 12 && isNaN(line[6])) { + buffer.push(`L${Outline.svgRound(line[10])} ${Outline.svgRound(line[11])}`); + continue; + } + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6).map(Outline.svgRound); + buffer.push(`C${c1x} ${c1y} ${c2x} ${c2y} ${x} ${y}`); + } + } + return buffer.join(""); + } + serialize([pageX, pageY, pageWidth, pageHeight], isForCopying) { + const serializedLines = []; + const serializedPoints = []; + const [x, y, width, height] = this.#getBBoxWithNoMargin(); + let tx, ty, sx, sy, x1, y1, x2, y2, rescaleFn; + switch (this.#rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = pageX; + ty = pageY + pageHeight; + sx = pageWidth; + sy = -pageHeight; + x1 = pageX + x * pageWidth; + y1 = pageY + (1 - y - height) * pageHeight; + x2 = pageX + (x + width) * pageWidth; + y2 = pageY + (1 - y) * pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX; + ty = pageY; + sx = pageWidth; + sy = pageHeight; + x1 = pageX + y * pageWidth; + y1 = pageY + x * pageHeight; + x2 = pageX + (y + height) * pageWidth; + y2 = pageY + (x + width) * pageHeight; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX + pageWidth; + ty = pageY; + sx = -pageWidth; + sy = pageHeight; + x1 = pageX + (1 - x - width) * pageWidth; + y1 = pageY + y * pageHeight; + x2 = pageX + (1 - x) * pageWidth; + y2 = pageY + (y + height) * pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageX + pageWidth; + ty = pageY + pageHeight; + sx = -pageWidth; + sy = -pageHeight; + x1 = pageX + (1 - y - height) * pageWidth; + y1 = pageY + (1 - x - width) * pageHeight; + x2 = pageX + (1 - y) * pageWidth; + y2 = pageY + (1 - x) * pageHeight; + break; + } + for (const { + line, + points + } of this.#lines) { + serializedLines.push(rescaleFn(line, tx, ty, sx, sy, isForCopying ? new Array(line.length) : null)); + serializedPoints.push(rescaleFn(points, tx, ty, sx, sy, isForCopying ? new Array(points.length) : null)); + } + return { + lines: serializedLines, + points: serializedPoints, + rect: [x1, y1, x2, y2] + }; + } + static deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, { + paths: { + lines, + points + }, + rotation, + thickness + }) { + const newLines = []; + let tx, ty, sx, sy, rescaleFn; + switch (rotation) { + case 0: + rescaleFn = Outline._rescale; + tx = -pageX / pageWidth; + ty = pageY / pageHeight + 1; + sx = 1 / pageWidth; + sy = -1 / pageHeight; + break; + case 90: + rescaleFn = Outline._rescaleAndSwap; + tx = -pageY / pageHeight; + ty = -pageX / pageWidth; + sx = 1 / pageHeight; + sy = 1 / pageWidth; + break; + case 180: + rescaleFn = Outline._rescale; + tx = pageX / pageWidth + 1; + ty = -pageY / pageHeight; + sx = -1 / pageWidth; + sy = 1 / pageHeight; + break; + case 270: + rescaleFn = Outline._rescaleAndSwap; + tx = pageY / pageHeight + 1; + ty = pageX / pageWidth + 1; + sx = -1 / pageHeight; + sy = -1 / pageWidth; + break; + } + if (!lines) { + lines = []; + for (const point of points) { + const len = point.length; + if (len === 2) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1]])); + continue; + } + if (len === 4) { + lines.push(new Float32Array([NaN, NaN, NaN, NaN, point[0], point[1], NaN, NaN, NaN, NaN, point[2], point[3]])); + continue; + } + const line = new Float32Array(3 * (len - 2)); + lines.push(line); + let [x1, y1, x2, y2] = point.subarray(0, 4); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = point[i]; + const y = point[i + 1]; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + } + for (let i = 0, ii = lines.length; i < ii; i++) { + newLines.push({ + line: rescaleFn(lines[i].map(x => x ?? NaN), tx, ty, sx, sy), + points: rescaleFn(points[i].map(x => x ?? NaN), tx, ty, sx, sy) + }); + } + const outlines = new this.prototype.constructor(); + outlines.build(newLines, pageWidth, pageHeight, 1, rotation, thickness, innerMargin); + return outlines; + } + #getMarginComponents(thickness = this.#thickness) { + const margin = this.#innerMargin + thickness / 2 * this.#parentScale; + return this.#rotation % 180 === 0 ? [margin / this.#parentWidth, margin / this.#parentHeight] : [margin / this.#parentHeight, margin / this.#parentWidth]; + } + #getBBoxWithNoMargin() { + const [x, y, width, height] = this.#bbox; + const [marginX, marginY] = this.#getMarginComponents(0); + return [x + marginX, y + marginY, width - 2 * marginX, height - 2 * marginY]; + } + #computeBbox() { + const bbox = this.#bbox = new Float32Array([Infinity, Infinity, -Infinity, -Infinity]); + for (const { + line + } of this.#lines) { + if (line.length <= 12) { + for (let i = 4, ii = line.length; i < ii; i += 6) { + Util.pointBoundingBox(line[i], line[i + 1], bbox); + } + continue; + } + let lastX = line[4], + lastY = line[5]; + for (let i = 6, ii = line.length; i < ii; i += 6) { + const [c1x, c1y, c2x, c2y, x, y] = line.subarray(i, i + 6); + Util.bezierBoundingBox(lastX, lastY, c1x, c1y, c2x, c2y, x, y, bbox); + lastX = x; + lastY = y; + } + } + const [marginX, marginY] = this.#getMarginComponents(); + bbox[0] = MathClamp(bbox[0] - marginX, 0, 1); + bbox[1] = MathClamp(bbox[1] - marginY, 0, 1); + bbox[2] = MathClamp(bbox[2] + marginX, 0, 1); + bbox[3] = MathClamp(bbox[3] + marginY, 0, 1); + bbox[2] -= bbox[0]; + bbox[3] -= bbox[1]; + } + get box() { + return this.#bbox; + } + updateProperty(name, value) { + if (name === "stroke-width") { + return this.#updateThickness(value); + } + return null; + } + #updateThickness(thickness) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#thickness = thickness; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const [diffMarginX, diffMarginY] = [newMarginX - oldMarginX, newMarginY - oldMarginY]; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateParentDimensions([width, height], scale) { + const [oldMarginX, oldMarginY] = this.#getMarginComponents(); + this.#parentWidth = width; + this.#parentHeight = height; + this.#parentScale = scale; + const [newMarginX, newMarginY] = this.#getMarginComponents(); + const diffMarginX = newMarginX - oldMarginX; + const diffMarginY = newMarginY - oldMarginY; + const bbox = this.#bbox; + bbox[0] -= diffMarginX; + bbox[1] -= diffMarginY; + bbox[2] += 2 * diffMarginX; + bbox[3] += 2 * diffMarginY; + return bbox; + } + updateRotation(rotation) { + this.#currentRotation = rotation; + return { + path: { + transform: this.rotationTransform + } + }; + } + get viewBox() { + return this.#bbox.map(Outline.svgRound).join(" "); + } + get defaultProperties() { + const [x, y] = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}` + } + }; + } + get rotationTransform() { + const [,, width, height] = this.#bbox; + let a = 0, + b = 0, + c = 0, + d = 0, + e = 0, + f = 0; + switch (this.#currentRotation) { + case 90: + b = height / width; + c = -width / height; + e = width; + break; + case 180: + a = -1; + d = -1; + e = width; + f = height; + break; + case 270: + b = -height / width; + c = width / height; + f = height; + break; + default: + return ""; + } + return `matrix(${a} ${b} ${c} ${d} ${Outline.svgRound(e)} ${Outline.svgRound(f)})`; + } + getPathResizingSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const [x, y, width, height] = this.#bbox; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + return { + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: `${this.rotationTransform} translate(${tx} ${ty})` + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const s2x = width / newWidth; + const s2y = height / newHeight; + return { + path: { + "transform-origin": `${Outline.svgRound(x)} ${Outline.svgRound(y)}`, + transform: `${this.rotationTransform} scale(${s2x} ${s2y}) ` + `translate(${Outline.svgRound(marginX)} ${Outline.svgRound(marginY)}) scale(${s1x} ${s1y}) ` + `translate(${Outline.svgRound(-marginX)} ${Outline.svgRound(-marginY)})` + } + }; + } + getPathResizedSVGProperties([newX, newY, newWidth, newHeight]) { + const [marginX, marginY] = this.#getMarginComponents(); + const bbox = this.#bbox; + const [x, y, width, height] = bbox; + bbox[0] = newX; + bbox[1] = newY; + bbox[2] = newWidth; + bbox[3] = newHeight; + if (Math.abs(width - marginX) <= Outline.PRECISION || Math.abs(height - marginY) <= Outline.PRECISION) { + const tx = newX + newWidth / 2 - (x + width / 2); + const ty = newY + newHeight / 2 - (y + height / 2); + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + const s1x = (newWidth - 2 * marginX) / (width - 2 * marginX); + const s1y = (newHeight - 2 * marginY) / (height - 2 * marginY); + const tx = -s1x * (x + marginX) + newX + marginX; + const ty = -s1y * (y + marginY) + newY + marginY; + if (s1x !== 1 || s1y !== 1 || tx !== 0 || ty !== 0) { + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, s1x, s1y, line); + Outline._rescale(points, tx, ty, s1x, s1y, points); + } + } + return { + root: { + viewBox: this.viewBox + }, + path: { + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}`, + transform: this.rotationTransform || null, + d: this.toSVGPath() + } + }; + } + getPathTranslatedSVGProperties([newX, newY], parentDimensions) { + const [newParentWidth, newParentHeight] = parentDimensions; + const bbox = this.#bbox; + const tx = newX - bbox[0]; + const ty = newY - bbox[1]; + if (this.#parentWidth === newParentWidth && this.#parentHeight === newParentHeight) { + for (const { + line, + points + } of this.#lines) { + Outline._translate(line, tx, ty, line); + Outline._translate(points, tx, ty, points); + } + } else { + const sx = this.#parentWidth / newParentWidth; + const sy = this.#parentHeight / newParentHeight; + this.#parentWidth = newParentWidth; + this.#parentHeight = newParentHeight; + for (const { + line, + points + } of this.#lines) { + Outline._rescale(line, tx, ty, sx, sy, line); + Outline._rescale(points, tx, ty, sx, sy, points); + } + bbox[2] *= sx; + bbox[3] *= sy; + } + bbox[0] = newX; + bbox[1] = newY; + return { + root: { + viewBox: this.viewBox + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(newX)} ${Outline.svgRound(newY)}` + } + }; + } + get defaultSVGProperties() { + const bbox = this.#bbox; + return { + root: { + viewBox: this.viewBox + }, + rootClass: { + draw: true + }, + path: { + d: this.toSVGPath(), + "transform-origin": `${Outline.svgRound(bbox[0])} ${Outline.svgRound(bbox[1])}`, + transform: this.rotationTransform || null + }, + bbox + }; + } +} + +;// ./src/display/editor/ink.js + + + + + + +class InkDrawingOptions extends DrawingOptions { + constructor(viewerParameters) { + super(); + this._viewParameters = viewerParameters; + super.updateProperties({ + fill: "none", + stroke: AnnotationEditor._defaultLineColor, + "stroke-opacity": 1, + "stroke-width": 1, + "stroke-linecap": "round", + "stroke-linejoin": "round", + "stroke-miterlimit": 10 + }); + } + updateSVGProperty(name, value) { + if (name === "stroke-width") { + value ??= this["stroke-width"]; + value *= this._viewParameters.realScale; + } + super.updateSVGProperty(name, value); + } + clone() { + const clone = new InkDrawingOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class InkEditor extends DrawingEditor { + static _type = "ink"; + static _editorType = AnnotationEditorType.INK; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + name: "inkEditor" + }); + this._willKeepAspectRatio = true; + this.defaultL10nId = "pdfjs-editor-ink-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new InkDrawingOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return true; + } + static get typesMap() { + return shadow(this, "typesMap", new Map([[AnnotationEditorParamsType.INK_THICKNESS, "stroke-width"], [AnnotationEditorParamsType.INK_COLOR, "stroke"], [AnnotationEditorParamsType.INK_OPACITY, "stroke-opacity"]])); + } + static createDrawerInstance(x, y, parentWidth, parentHeight, rotation) { + return new InkDrawOutliner(x, y, parentWidth, parentHeight, rotation, this._defaultDrawingOptions["stroke-width"]); + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + if (data instanceof InkAnnotationElement) { + const { + data: { + inkLists, + rect, + rotation, + id, + color, + opacity, + borderStyle: { + rawWidth: thickness + }, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + parent: { + page: { + pageNumber + } + } + } = data; + initialData = data = { + annotationType: AnnotationEditorType.INK, + color: Array.from(color), + thickness, + opacity, + paths: { + points: inkLists + }, + boxes: null, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + return editor; + } + get toolbarButtons() { + this._colorPicker ||= new BasicColorPicker(this); + return [["colorPicker", this._colorPicker]]; + } + get colorType() { + return AnnotationEditorParamsType.INK_COLOR; + } + get color() { + return this._drawingOptions.stroke; + } + get opacity() { + return this._drawingOptions["stroke-opacity"]; + } + onScaleChanging() { + if (!this.parent) { + return; + } + super.onScaleChanging(); + const { + _drawId, + _drawingOptions, + parent + } = this; + _drawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(_drawId, _drawingOptions.toSVGProperties()); + } + static onScaleChangingWhenDrawing() { + const parent = this._currentParent; + if (!parent) { + return; + } + super.onScaleChangingWhenDrawing(); + this._defaultDrawingOptions.updateSVGProperty("stroke-width"); + parent.drawLayer.updateProperties(this._currentDrawId, this._defaultDrawingOptions.toSVGProperties()); + } + createDrawingOptions({ + color, + thickness, + opacity + }) { + this._drawingOptions = InkEditor.getDefaultDrawingOptions({ + stroke: Util.makeHexColor(...color), + "stroke-width": thickness, + "stroke-opacity": opacity + }); + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + stroke, + "stroke-opacity": opacity, + "stroke-width": thickness + } + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + color: AnnotationEditor._colorManager.convert(stroke), + opacity, + thickness, + paths: { + lines, + points + } + }); + this.addComment(serialized); + if (isForCopying) { + serialized.isCopy = true; + return serialized; + } + if (this.annotationElementId && !this.#hasElementChanged(serialized)) { + return null; + } + serialized.id = this.annotationElementId; + return serialized; + } + #hasElementChanged(serialized) { + const { + color, + thickness, + opacity, + pageIndex + } = this._initialData; + return this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized || serialized.color.some((c, i) => c !== color[i]) || serialized.thickness !== thickness || serialized.opacity !== opacity || serialized.pageIndex !== pageIndex; + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + const { + points, + rect + } = this.serializeDraw(false); + annotation.updateEdited({ + rect, + thickness: this._drawingOptions["stroke-width"], + points, + popup: this.comment + }); + return null; + } +} + +;// ./src/display/editor/drawers/contour.js + +class ContourDrawOutline extends InkDrawOutline { + toSVGPath() { + let path = super.toSVGPath(); + if (!path.endsWith("Z")) { + path += "Z"; + } + return path; + } +} + +;// ./src/display/editor/drawers/signaturedraw.js + + + + +const BASE_HEADER_LENGTH = 8; +const POINTS_PROPERTIES_NUMBER = 3; +class SignatureExtractor { + static #PARAMETERS = { + maxDim: 512, + sigmaSFactor: 0.02, + sigmaR: 25, + kernelSize: 16 + }; + static #neighborIndexToId(i0, j0, i, j) { + i -= i0; + j -= j0; + if (i === 0) { + return j > 0 ? 0 : 4; + } + if (i === 1) { + return j + 6; + } + return 2 - j; + } + static #neighborIdToIndex = new Int32Array([0, 1, -1, 1, -1, 0, -1, -1, 0, -1, 1, -1, 1, 0, 1, 1]); + static #clockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (-k + id - offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #counterClockwiseNonZero(buf, width, i0, j0, i, j, offset) { + const id = this.#neighborIndexToId(i0, j0, i, j); + for (let k = 0; k < 8; k++) { + const kk = (k + id + offset + 16) % 8; + const shiftI = this.#neighborIdToIndex[2 * kk]; + const shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + if (buf[(i0 + shiftI) * width + (j0 + shiftJ)] !== 0) { + return kk; + } + } + return -1; + } + static #findContours(buf, width, height, threshold) { + const N = buf.length; + const types = new Int32Array(N); + for (let i = 0; i < N; i++) { + types[i] = buf[i] <= threshold ? 1 : 0; + } + for (let i = 1; i < height - 1; i++) { + types[i * width] = types[i * width + width - 1] = 0; + } + for (let i = 0; i < width; i++) { + types[i] = types[width * height - 1 - i] = 0; + } + let nbd = 1; + let lnbd; + const contours = []; + for (let i = 1; i < height - 1; i++) { + lnbd = 1; + for (let j = 1; j < width - 1; j++) { + const ij = i * width + j; + const pix = types[ij]; + if (pix === 0) { + continue; + } + let i2 = i; + let j2 = j; + if (pix === 1 && types[ij - 1] === 0) { + nbd += 1; + j2 -= 1; + } else if (pix >= 1 && types[ij + 1] === 0) { + nbd += 1; + j2 += 1; + if (pix > 1) { + lnbd = pix; + } + } else { + if (pix !== 1) { + lnbd = Math.abs(pix); + } + continue; + } + const points = [j, i]; + const isHole = j2 === j + 1; + const contour = { + isHole, + points, + id: nbd, + parent: 0 + }; + contours.push(contour); + let contour0; + for (const c of contours) { + if (c.id === lnbd) { + contour0 = c; + break; + } + } + if (!contour0) { + contour.parent = isHole ? lnbd : 0; + } else if (contour0.isHole) { + contour.parent = isHole ? contour0.parent : lnbd; + } else { + contour.parent = isHole ? lnbd : contour0.parent; + } + const k = this.#clockwiseNonZero(types, width, i, j, i2, j2, 0); + if (k === -1) { + types[ij] = -nbd; + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + continue; + } + let shiftI = this.#neighborIdToIndex[2 * k]; + let shiftJ = this.#neighborIdToIndex[2 * k + 1]; + const i1 = i + shiftI; + const j1 = j + shiftJ; + i2 = i1; + j2 = j1; + let i3 = i; + let j3 = j; + while (true) { + const kk = this.#counterClockwiseNonZero(types, width, i3, j3, i2, j2, 1); + shiftI = this.#neighborIdToIndex[2 * kk]; + shiftJ = this.#neighborIdToIndex[2 * kk + 1]; + const i4 = i3 + shiftI; + const j4 = j3 + shiftJ; + points.push(j4, i4); + const ij3 = i3 * width + j3; + if (types[ij3 + 1] === 0) { + types[ij3] = -nbd; + } else if (types[ij3] === 1) { + types[ij3] = nbd; + } + if (i4 === i && j4 === j && i3 === i1 && j3 === j1) { + if (types[ij] !== 1) { + lnbd = Math.abs(types[ij]); + } + break; + } else { + i2 = i3; + j2 = j3; + i3 = i4; + j3 = j4; + } + } + } + } + return contours; + } + static #douglasPeuckerHelper(points, start, end, output) { + if (end - start <= 4) { + for (let i = start; i < end - 2; i += 2) { + output.push(points[i], points[i + 1]); + } + return; + } + const ax = points[start]; + const ay = points[start + 1]; + const abx = points[end - 4] - ax; + const aby = points[end - 3] - ay; + const dist = Math.hypot(abx, aby); + const nabx = abx / dist; + const naby = aby / dist; + const aa = nabx * ay - naby * ax; + const m = aby / abx; + const invS = 1 / dist; + const phi = Math.atan(m); + const cosPhi = Math.cos(phi); + const sinPhi = Math.sin(phi); + const tmax = invS * (Math.abs(cosPhi) + Math.abs(sinPhi)); + const poly = invS * (1 - tmax + tmax ** 2); + const partialPhi = Math.max(Math.atan(Math.abs(sinPhi + cosPhi) * poly), Math.atan(Math.abs(sinPhi - cosPhi) * poly)); + let dmax = 0; + let index = start; + for (let i = start + 2; i < end - 2; i += 2) { + const d = Math.abs(aa - nabx * points[i + 1] + naby * points[i]); + if (d > dmax) { + index = i; + dmax = d; + } + } + if (dmax > (dist * partialPhi) ** 2) { + this.#douglasPeuckerHelper(points, start, index + 2, output); + this.#douglasPeuckerHelper(points, index, end, output); + } else { + output.push(ax, ay); + } + } + static #douglasPeucker(points) { + const output = []; + const len = points.length; + this.#douglasPeuckerHelper(points, 0, len, output); + output.push(points[len - 2], points[len - 1]); + return output.length <= 4 ? null : output; + } + static #bilateralFilter(buf, width, height, sigmaS, sigmaR, kernelSize) { + const kernel = new Float32Array(kernelSize ** 2); + const sigmaS2 = -2 * sigmaS ** 2; + const halfSize = kernelSize >> 1; + for (let i = 0; i < kernelSize; i++) { + const x = (i - halfSize) ** 2; + for (let j = 0; j < kernelSize; j++) { + kernel[i * kernelSize + j] = Math.exp((x + (j - halfSize) ** 2) / sigmaS2); + } + } + const rangeValues = new Float32Array(256); + const sigmaR2 = -2 * sigmaR ** 2; + for (let i = 0; i < 256; i++) { + rangeValues[i] = Math.exp(i ** 2 / sigmaR2); + } + const N = buf.length; + const out = new Uint8Array(N); + const histogram = new Uint32Array(256); + for (let i = 0; i < height; i++) { + for (let j = 0; j < width; j++) { + const ij = i * width + j; + const center = buf[ij]; + let sum = 0; + let norm = 0; + for (let k = 0; k < kernelSize; k++) { + const y = i + k - halfSize; + if (y < 0 || y >= height) { + continue; + } + for (let l = 0; l < kernelSize; l++) { + const x = j + l - halfSize; + if (x < 0 || x >= width) { + continue; + } + const neighbour = buf[y * width + x]; + const w = kernel[k * kernelSize + l] * rangeValues[Math.abs(neighbour - center)]; + sum += neighbour * w; + norm += w; + } + } + const pix = out[ij] = Math.round(sum / norm); + histogram[pix]++; + } + } + return [out, histogram]; + } + static #getHistogram(buf) { + const histogram = new Uint32Array(256); + for (const g of buf) { + histogram[g]++; + } + return histogram; + } + static #toUint8(buf) { + const N = buf.length; + const out = new Uint8ClampedArray(N >> 2); + let max = -Infinity; + let min = Infinity; + for (let i = 0, ii = out.length; i < ii; i++) { + const pix = out[i] = buf[i << 2]; + max = Math.max(max, pix); + min = Math.min(min, pix); + } + const ratio = 255 / (max - min); + for (let i = 0, ii = out.length; i < ii; i++) { + out[i] = (out[i] - min) * ratio; + } + return out; + } + static #guessThreshold(histogram) { + let i; + let M = -Infinity; + let L = -Infinity; + const min = histogram.findIndex(v => v !== 0); + let pos = min; + let spos = min; + for (i = min; i < 256; i++) { + const v = histogram[i]; + if (v > M) { + if (i - pos > L) { + L = i - pos; + spos = i - 1; + } + M = v; + pos = i; + } + } + for (i = spos - 1; i >= 0; i--) { + if (histogram[i] > histogram[i + 1]) { + break; + } + } + return i; + } + static #getGrayPixels(bitmap) { + const originalBitmap = bitmap; + const { + width, + height + } = bitmap; + const { + maxDim + } = this.#PARAMETERS; + let newWidth = width; + let newHeight = height; + if (width > maxDim || height > maxDim) { + let prevWidth = width; + let prevHeight = height; + let steps = Math.log2(Math.max(width, height) / maxDim); + const isteps = Math.floor(steps); + steps = steps === isteps ? isteps - 1 : isteps; + for (let i = 0; i < steps; i++) { + newWidth = Math.ceil(prevWidth / 2); + newHeight = Math.ceil(prevHeight / 2); + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + prevWidth = newWidth; + prevHeight = newHeight; + if (bitmap !== originalBitmap) { + bitmap.close(); + } + bitmap = offscreen.transferToImageBitmap(); + } + const ratio = Math.min(maxDim / newWidth, maxDim / newHeight); + newWidth = Math.round(newWidth * ratio); + newHeight = Math.round(newHeight * ratio); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d", { + willReadFrequently: true + }); + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, newWidth, newHeight); + ctx.filter = "grayscale(1)"; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, newWidth, newHeight); + const grayImage = ctx.getImageData(0, 0, newWidth, newHeight).data; + const uint8Buf = this.#toUint8(grayImage); + return [uint8Buf, newWidth, newHeight]; + } + static extractContoursFromText(text, { + fontFamily, + fontStyle, + fontWeight + }, pageWidth, pageHeight, rotation, innerMargin) { + let canvas = new OffscreenCanvas(1, 1); + let ctx = canvas.getContext("2d", { + alpha: false + }); + const fontSize = 200; + const font = ctx.font = `${fontStyle} ${fontWeight} ${fontSize}px ${fontFamily}`; + const { + actualBoundingBoxLeft, + actualBoundingBoxRight, + actualBoundingBoxAscent, + actualBoundingBoxDescent, + fontBoundingBoxAscent, + fontBoundingBoxDescent, + width + } = ctx.measureText(text); + const SCALE = 1.5; + const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE); + const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE); + canvas = new OffscreenCanvas(canvasWidth, canvasHeight); + ctx = canvas.getContext("2d", { + alpha: true, + willReadFrequently: true + }); + ctx.font = font; + ctx.filter = "grayscale(1)"; + ctx.fillStyle = "white"; + ctx.fillRect(0, 0, canvasWidth, canvasHeight); + ctx.fillStyle = "black"; + ctx.fillText(text, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2); + const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data); + const histogram = this.#getHistogram(uint8Buf); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(uint8Buf, canvasWidth, canvasHeight, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width: canvasWidth, + height: canvasHeight + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static process(bitmap, pageWidth, pageHeight, rotation, innerMargin) { + const [uint8Buf, width, height] = this.#getGrayPixels(bitmap); + const [buffer, histogram] = this.#bilateralFilter(uint8Buf, width, height, Math.hypot(width, height) * this.#PARAMETERS.sigmaSFactor, this.#PARAMETERS.sigmaR, this.#PARAMETERS.kernelSize); + const threshold = this.#guessThreshold(histogram); + const contourList = this.#findContours(buffer, width, height, threshold); + return this.processDrawnLines({ + lines: { + curves: contourList, + width, + height + }, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth: true, + areContours: true + }); + } + static processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin, + mustSmooth, + areContours + }) { + if (rotation % 180 !== 0) { + [pageWidth, pageHeight] = [pageHeight, pageWidth]; + } + const { + curves, + width, + height + } = lines; + const thickness = lines.thickness ?? 0; + const linesAndPoints = []; + const ratio = Math.min(pageWidth / width, pageHeight / height); + const xScale = ratio / pageWidth; + const yScale = ratio / pageHeight; + const newCurves = []; + for (const { + points + } of curves) { + const reducedPoints = mustSmooth ? this.#douglasPeucker(points) : points; + if (!reducedPoints) { + continue; + } + newCurves.push(reducedPoints); + const len = reducedPoints.length; + const newPoints = new Float32Array(len); + const line = new Float32Array(3 * (len === 2 ? 2 : len - 2)); + linesAndPoints.push({ + line, + points: newPoints + }); + if (len === 2) { + newPoints[0] = reducedPoints[0] * xScale; + newPoints[1] = reducedPoints[1] * yScale; + line.set([NaN, NaN, NaN, NaN, newPoints[0], newPoints[1]], 0); + continue; + } + let [x1, y1, x2, y2] = reducedPoints; + x1 *= xScale; + y1 *= yScale; + x2 *= xScale; + y2 *= yScale; + newPoints.set([x1, y1, x2, y2], 0); + line.set([NaN, NaN, NaN, NaN, x1, y1], 0); + for (let i = 4; i < len; i += 2) { + const x = newPoints[i] = reducedPoints[i] * xScale; + const y = newPoints[i + 1] = reducedPoints[i + 1] * yScale; + line.set(Outline.createBezierPoints(x1, y1, x2, y2, x, y), (i - 2) * 3); + [x1, y1, x2, y2] = [x2, y2, x, y]; + } + } + if (linesAndPoints.length === 0) { + return null; + } + const outline = areContours ? new ContourDrawOutline() : new InkDrawOutline(); + outline.build(linesAndPoints, pageWidth, pageHeight, 1, rotation, areContours ? 0 : thickness, innerMargin); + return { + outline, + newCurves, + areContours, + thickness, + width, + height + }; + } + static async compressSignature({ + outlines, + areContours, + thickness, + width, + height + }) { + let minDiff = Infinity; + let maxDiff = -Infinity; + let outlinesLength = 0; + for (const points of outlines) { + outlinesLength += points.length; + for (let i = 2, ii = points.length; i < ii; i++) { + const dx = points[i] - points[i - 2]; + minDiff = Math.min(minDiff, dx); + maxDiff = Math.max(maxDiff, dx); + } + } + let bufferType; + if (minDiff >= -128 && maxDiff <= 127) { + bufferType = Int8Array; + } else if (minDiff >= -32768 && maxDiff <= 32767) { + bufferType = Int16Array; + } else { + bufferType = Int32Array; + } + const len = outlines.length; + const headerLength = BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * len; + const header = new Uint32Array(headerLength); + let offset = 0; + header[offset++] = headerLength * Uint32Array.BYTES_PER_ELEMENT + (outlinesLength - 2 * len) * bufferType.BYTES_PER_ELEMENT; + header[offset++] = 0; + header[offset++] = width; + header[offset++] = height; + header[offset++] = areContours ? 0 : 1; + header[offset++] = Math.max(0, Math.floor(thickness ?? 0)); + header[offset++] = len; + header[offset++] = bufferType.BYTES_PER_ELEMENT; + for (const points of outlines) { + header[offset++] = points.length - 2; + header[offset++] = points[0]; + header[offset++] = points[1]; + } + const cs = new CompressionStream("deflate-raw"); + const writer = cs.writable.getWriter(); + await writer.ready; + writer.write(header); + const BufferCtor = bufferType.prototype.constructor; + for (const points of outlines) { + const diffs = new BufferCtor(points.length - 2); + for (let i = 2, ii = points.length; i < ii; i++) { + diffs[i - 2] = points[i] - points[i - 2]; + } + writer.write(diffs); + } + writer.close(); + const buf = await new Response(cs.readable).arrayBuffer(); + const bytes = new Uint8Array(buf); + return toBase64Util(bytes); + } + static async decompressSignature(signatureData) { + try { + const bytes = fromBase64Util(signatureData); + const { + readable, + writable + } = new DecompressionStream("deflate-raw"); + const writer = writable.getWriter(); + await writer.ready; + writer.write(bytes).then(async () => { + await writer.ready; + await writer.close(); + }).catch(() => {}); + let data = null; + let offset = 0; + for await (const chunk of readable) { + data ||= new Uint8Array(new Uint32Array(chunk.buffer, 0, 4)[0]); + data.set(chunk, offset); + offset += chunk.length; + } + const header = new Uint32Array(data.buffer, 0, data.length >> 2); + const version = header[1]; + if (version !== 0) { + throw new Error(`Invalid version: ${version}`); + } + const width = header[2]; + const height = header[3]; + const areContours = header[4] === 0; + const thickness = header[5]; + const numberOfDrawings = header[6]; + const bufferType = header[7]; + const outlines = []; + const diffsOffset = (BASE_HEADER_LENGTH + POINTS_PROPERTIES_NUMBER * numberOfDrawings) * Uint32Array.BYTES_PER_ELEMENT; + let diffs; + switch (bufferType) { + case Int8Array.BYTES_PER_ELEMENT: + diffs = new Int8Array(data.buffer, diffsOffset); + break; + case Int16Array.BYTES_PER_ELEMENT: + diffs = new Int16Array(data.buffer, diffsOffset); + break; + case Int32Array.BYTES_PER_ELEMENT: + diffs = new Int32Array(data.buffer, diffsOffset); + break; + } + offset = 0; + for (let i = 0; i < numberOfDrawings; i++) { + const len = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH]; + const points = new Float32Array(len + 2); + outlines.push(points); + for (let j = 0; j < POINTS_PROPERTIES_NUMBER - 1; j++) { + points[j] = header[POINTS_PROPERTIES_NUMBER * i + BASE_HEADER_LENGTH + j + 1]; + } + for (let j = 0; j < len; j++) { + points[j + 2] = points[j] + diffs[offset++]; + } + } + return { + areContours, + thickness, + outlines, + width, + height + }; + } catch (e) { + warn(`decompressSignature: ${e}`); + return null; + } + } +} + +;// ./src/display/editor/signature.js + + + + + + + +class SignatureOptions extends DrawingOptions { + constructor() { + super(); + super.updateProperties({ + fill: AnnotationEditor._defaultLineColor, + "stroke-width": 0 + }); + } + clone() { + const clone = new SignatureOptions(); + clone.updateAll(this); + return clone; + } +} +class DrawnSignatureOptions extends InkDrawingOptions { + constructor(viewerParameters) { + super(viewerParameters); + super.updateProperties({ + stroke: AnnotationEditor._defaultLineColor, + "stroke-width": 1 + }); + } + clone() { + const clone = new DrawnSignatureOptions(this._viewParameters); + clone.updateAll(this); + return clone; + } +} +class SignatureEditor extends DrawingEditor { + #isExtracted = false; + #description = null; + #signatureData = null; + #signatureUUID = null; + static _type = "signature"; + static _editorType = AnnotationEditorType.SIGNATURE; + static _defaultDrawingOptions = null; + constructor(params) { + super({ + ...params, + mustBeCommitted: true, + name: "signatureEditor" + }); + this._willKeepAspectRatio = true; + this.#signatureData = params.signatureData || null; + this.#description = null; + this.defaultL10nId = "pdfjs-editor-signature-editor1"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + this._defaultDrawingOptions = new SignatureOptions(); + this._defaultDrawnSignatureOptions = new DrawnSignatureOptions(uiManager.viewParameters); + } + static getDefaultDrawingOptions(options) { + const clone = this._defaultDrawingOptions.clone(); + clone.updateProperties(options); + return clone; + } + static get supportMultipleDrawings() { + return false; + } + static get typesMap() { + return shadow(this, "typesMap", new Map()); + } + static get isDrawer() { + return false; + } + get telemetryFinalData() { + return { + type: "signature", + hasDescription: !!this.#description + }; + } + static computeTelemetryFinalData(data) { + const hasDescriptionStats = data.get("hasDescription"); + return { + hasAltText: hasDescriptionStats.get(true) ?? 0, + hasNoAltText: hasDescriptionStats.get(false) ?? 0 + }; + } + get isResizable() { + return true; + } + onScaleChanging() { + if (this._drawId === null) { + return; + } + super.onScaleChanging(); + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + const { + _isCopy + } = this; + if (_isCopy) { + this._isCopy = false; + baseX = this.x; + baseY = this.y; + } + super.render(); + if (this._drawId === null) { + if (this.#signatureData) { + const { + lines, + mustSmooth, + areContours, + description, + uuid, + heightInPage + } = this.#signatureData; + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + const outline = SignatureExtractor.processDrawnLines({ + lines, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth, + areContours + }); + this.addSignature(outline, heightInPage, description, uuid); + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: "" + })); + this.div.hidden = true; + this._uiManager.getSignature(this); + } + } else { + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description: this.#description || "" + })); + } + if (_isCopy) { + this._isCopy = true; + this._moveAfterPaste(baseX, baseY); + } + return this.div; + } + setUuid(uuid) { + this.#signatureUUID = uuid; + this.addEditToolbar(); + } + getUuid() { + return this.#signatureUUID; + } + get description() { + return this.#description; + } + set description(description) { + this.#description = description; + if (!this.div) { + return; + } + this.div.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + super.addEditToolbar().then(toolbar => { + toolbar?.updateEditSignatureButton(description); + }); + } + getSignaturePreview() { + const { + newCurves, + areContours, + thickness, + width, + height + } = this.#signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves: newCurves.map(points => ({ + points + })), + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + return { + areContours, + outline: outlineData.outline + }; + } + get toolbarButtons() { + if (this._uiManager.signatureManager) { + return [["editSignature", this._uiManager.signatureManager]]; + } + return super.toolbarButtons; + } + addSignature(data, heightInPage, description, uuid) { + const { + x: savedX, + y: savedY + } = this; + const { + outline + } = this.#signatureData = data; + this.#isExtracted = outline instanceof ContourDrawOutline; + this.description = description; + let drawingOptions; + if (this.#isExtracted) { + drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + drawingOptions.updateProperties({ + "stroke-width": outline.thickness + }); + } + this._addOutlines({ + drawOutlines: outline, + drawingOptions + }); + const [, pageHeight] = this.pageDimensions; + let newHeight = heightInPage / pageHeight; + newHeight = newHeight >= 1 ? 0.5 : newHeight; + this.width *= newHeight / this.height; + if (this.width >= 1) { + newHeight *= 0.9 / this.width; + this.width = 0.9; + } + this.height = newHeight; + this.setDims(); + this.x = savedX; + this.y = savedY; + this.center(); + this._onResized(); + this.onScaleChanging(); + this.rotate(); + this._uiManager.addToAnnotationStorage(this); + this.setUuid(uuid); + this._reportTelemetry({ + action: "pdfjs.signature.inserted", + data: { + hasBeenSaved: !!uuid, + hasDescription: !!description + } + }); + this.div.hidden = false; + } + getFromImage(bitmap) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getFromText(text, fontInfo) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.extractContoursFromText(text, fontInfo, pageWidth, pageHeight, rotation, SignatureEditor._INNER_MARGIN); + } + getDrawnSignature(curves) { + const { + rawDims: { + pageWidth, + pageHeight + }, + rotation + } = this.parent.viewport; + return SignatureExtractor.processDrawnLines({ + lines: curves, + pageWidth, + pageHeight, + rotation, + innerMargin: SignatureEditor._INNER_MARGIN, + mustSmooth: false, + areContours: false + }); + } + createDrawingOptions({ + areContours, + thickness + }) { + if (areContours) { + this._drawingOptions = SignatureEditor.getDefaultDrawingOptions(); + } else { + this._drawingOptions = SignatureEditor._defaultDrawnSignatureOptions.clone(); + this._drawingOptions.updateProperties({ + "stroke-width": thickness + }); + } + } + serialize(isForCopying = false) { + if (this.isEmpty()) { + return null; + } + const { + lines, + points + } = this.serializeDraw(isForCopying); + const { + _drawingOptions: { + "stroke-width": thickness + } + } = this; + const serialized = Object.assign(super.serialize(isForCopying), { + isSignature: true, + areContours: this.#isExtracted, + color: [0, 0, 0], + thickness: this.#isExtracted ? 0 : thickness + }); + this.addComment(serialized); + if (isForCopying) { + serialized.paths = { + lines, + points + }; + serialized.uuid = this.#signatureUUID; + serialized.isCopy = true; + } else { + serialized.lines = lines; + } + if (this.#description) { + serialized.accessibilityData = { + type: "Figure", + alt: this.#description + }; + } + return serialized; + } + static deserializeDraw(pageX, pageY, pageWidth, pageHeight, innerMargin, data) { + if (data.areContours) { + return ContourDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + return InkDrawOutline.deserialize(pageX, pageY, pageWidth, pageHeight, innerMargin, data); + } + static async deserialize(data, parent, uiManager) { + const editor = await super.deserialize(data, parent, uiManager); + editor.#isExtracted = data.areContours; + editor.description = data.accessibilityData?.alt || ""; + editor.#signatureUUID = data.uuid; + return editor; + } +} + +;// ./src/display/editor/stamp.js + + + + +class StampEditor extends AnnotationEditor { + #bitmap = null; + #bitmapId = null; + #bitmapPromise = null; + #bitmapUrl = null; + #bitmapFile = null; + #bitmapFileName = ""; + #canvas = null; + #missingCanvas = false; + #resizeTimeoutId = null; + #isSvg = false; + #hasBeenAddedInUndoStack = false; + static _type = "stamp"; + static _editorType = AnnotationEditorType.STAMP; + constructor(params) { + super({ + ...params, + name: "stampEditor" + }); + this.#bitmapUrl = params.bitmapUrl; + this.#bitmapFile = params.bitmapFile; + this.defaultL10nId = "pdfjs-editor-stamp-editor"; + } + static initialize(l10n, uiManager) { + AnnotationEditor.initialize(l10n, uiManager); + } + static isHandlingMimeForPasting(mime) { + return SupportedImageMimeTypes.includes(mime); + } + static paste(item, parent) { + parent.pasteEditor({ + mode: AnnotationEditorType.STAMP + }, { + bitmapFile: item.getAsFile() + }); + } + altTextFinish() { + if (this._uiManager.useNewAltTextFlow) { + this.div.hidden = false; + } + super.altTextFinish(); + } + get telemetryFinalData() { + return { + type: "stamp", + hasAltText: !!this.altTextData?.altText + }; + } + static computeTelemetryFinalData(data) { + const hasAltTextStats = data.get("hasAltText"); + return { + hasAltText: hasAltTextStats.get(true) ?? 0, + hasNoAltText: hasAltTextStats.get(false) ?? 0 + }; + } + #getBitmapFetched(data, fromId = false) { + if (!data) { + this.remove(); + return; + } + this.#bitmap = data.bitmap; + if (!fromId) { + this.#bitmapId = data.id; + this.#isSvg = data.isSvg; + } + if (data.file) { + this.#bitmapFileName = data.file.name; + } + this.#createCanvas(); + } + #getBitmapDone() { + this.#bitmapPromise = null; + this._uiManager.enableWaiting(false); + if (!this.#canvas) { + return; + } + if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this.addEditToolbar().then(() => { + this._editToolbar.hide(); + this._uiManager.editAltText(this, true); + }); + return; + } + if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && this.#bitmap) { + this._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: false, + alt_text_type: "empty" + } + }); + try { + this.mlGuessAltText(); + } catch {} + } + this.div.focus(); + } + async mlGuessAltText(imageData = null, updateAltTextData = true) { + if (this.hasAltTextData()) { + return null; + } + const { + mlManager + } = this._uiManager; + if (!mlManager) { + throw new Error("No ML."); + } + if (!(await mlManager.isEnabledFor("altText"))) { + throw new Error("ML isn't enabled for alt text."); + } + const { + data, + width, + height + } = imageData || this.copyCanvas(null, null, true).imageData; + const response = await mlManager.guess({ + name: "altText", + request: { + data, + width, + height, + channels: data.length / (width * height) + } + }); + if (!response) { + throw new Error("No response from the AI service."); + } + if (response.error) { + throw new Error("Error from the AI service."); + } + if (response.cancel) { + return null; + } + if (!response.output) { + throw new Error("No valid response from the AI service."); + } + const altText = response.output; + await this.setGuessedAltText(altText); + if (updateAltTextData && !this.hasAltTextData()) { + this.altTextData = { + alt: altText, + decorative: false + }; + } + return altText; + } + #getBitmap() { + if (this.#bitmapId) { + this._uiManager.enableWaiting(true); + this._uiManager.imageManager.getFromId(this.#bitmapId).then(data => this.#getBitmapFetched(data, true)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapUrl) { + const url = this.#bitmapUrl; + this.#bitmapUrl = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromUrl(url).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + if (this.#bitmapFile) { + const file = this.#bitmapFile; + this.#bitmapFile = null; + this._uiManager.enableWaiting(true); + this.#bitmapPromise = this._uiManager.imageManager.getFromFile(file).then(data => this.#getBitmapFetched(data)).finally(() => this.#getBitmapDone()); + return; + } + const input = document.createElement("input"); + input.type = "file"; + input.accept = SupportedImageMimeTypes.join(","); + const signal = this._uiManager._signal; + this.#bitmapPromise = new Promise(resolve => { + input.addEventListener("change", async () => { + if (!input.files || input.files.length === 0) { + this.remove(); + } else { + this._uiManager.enableWaiting(true); + const data = await this._uiManager.imageManager.getFromFile(input.files[0]); + this._reportTelemetry({ + action: "pdfjs.image.image_selected", + data: { + alt_text_modal: this._uiManager.useNewAltTextFlow + } + }); + this.#getBitmapFetched(data); + } + resolve(); + }, { + signal + }); + input.addEventListener("cancel", () => { + this.remove(); + resolve(); + }, { + signal + }); + }).finally(() => this.#getBitmapDone()); + input.click(); + } + remove() { + if (this.#bitmapId) { + this.#bitmap = null; + this._uiManager.imageManager.deleteId(this.#bitmapId); + this.#canvas?.remove(); + this.#canvas = null; + if (this.#resizeTimeoutId) { + clearTimeout(this.#resizeTimeoutId); + this.#resizeTimeoutId = null; + } + } + super.remove(); + } + rebuild() { + if (!this.parent) { + if (this.#bitmapId) { + this.#getBitmap(); + } + return; + } + super.rebuild(); + if (this.div === null) { + return; + } + if (this.#bitmapId && this.#canvas === null) { + this.#getBitmap(); + } + if (!this.isAttachedToDOM) { + this.parent.add(this); + } + } + onceAdded(focus) { + this._isDraggable = true; + if (focus) { + this.div.focus(); + } + } + isEmpty() { + return !(this.#bitmapPromise || this.#bitmap || this.#bitmapUrl || this.#bitmapFile || this.#bitmapId || this.#missingCanvas); + } + get toolbarButtons() { + return [["altText", this.createAltText()]]; + } + get isResizable() { + return true; + } + render() { + if (this.div) { + return this.div; + } + let baseX, baseY; + if (this._isCopy) { + baseX = this.x; + baseY = this.y; + } + super.render(); + this.div.hidden = true; + this.createAltText(); + if (!this.#missingCanvas) { + if (this.#bitmap) { + this.#createCanvas(); + } else { + this.#getBitmap(); + } + } + if (this._isCopy) { + this._moveAfterPaste(baseX, baseY); + } + this._uiManager.addShouldRescale(this); + return this.div; + } + setCanvas(annotationElementId, canvas) { + const { + id: bitmapId, + bitmap + } = this._uiManager.imageManager.getFromCanvas(annotationElementId, canvas); + canvas.remove(); + if (bitmapId && this._uiManager.imageManager.isValidId(bitmapId)) { + this.#bitmapId = bitmapId; + if (bitmap) { + this.#bitmap = bitmap; + } + this.#missingCanvas = false; + this.#createCanvas(); + } + } + _onResized() { + this.onScaleChanging(); + } + onScaleChanging() { + if (!this.parent) { + return; + } + if (this.#resizeTimeoutId !== null) { + clearTimeout(this.#resizeTimeoutId); + } + const TIME_TO_WAIT = 200; + this.#resizeTimeoutId = setTimeout(() => { + this.#resizeTimeoutId = null; + this.#drawBitmap(); + }, TIME_TO_WAIT); + } + #createCanvas() { + const { + div + } = this; + let { + width, + height + } = this.#bitmap; + const [pageWidth, pageHeight] = this.pageDimensions; + const MAX_RATIO = 0.75; + if (this.width) { + width = this.width * pageWidth; + height = this.height * pageHeight; + } else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) { + const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height); + width *= factor; + height *= factor; + } + this._uiManager.enableWaiting(false); + const canvas = this.#canvas = document.createElement("canvas"); + canvas.setAttribute("role", "img"); + this.addContainer(canvas); + this.width = width / pageWidth; + this.height = height / pageHeight; + this.setDims(); + if (this._initialOptions?.isCentered) { + this.center(); + } else { + this.fixAndSetPosition(); + } + this._initialOptions = null; + if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow || this.annotationElementId) { + div.hidden = false; + } + this.#drawBitmap(); + if (!this.#hasBeenAddedInUndoStack) { + this.parent.addUndoableEditor(this); + this.#hasBeenAddedInUndoStack = true; + } + this._reportTelemetry({ + action: "inserted_image" + }); + if (this.#bitmapFileName) { + this.div.setAttribute("aria-description", this.#bitmapFileName); + } + if (!this.annotationElementId) { + this._uiManager.a11yAlert("pdfjs-editor-stamp-added-alert"); + } + } + copyCanvas(maxDataDimension, maxPreviewDimension, createImageData = false) { + if (!maxDataDimension) { + maxDataDimension = 224; + } + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + const outputScale = new OutputScale(); + let bitmap = this.#bitmap; + let width = bitmapWidth, + height = bitmapHeight; + let canvas = null; + if (maxPreviewDimension) { + if (bitmapWidth > maxPreviewDimension || bitmapHeight > maxPreviewDimension) { + const ratio = Math.min(maxPreviewDimension / bitmapWidth, maxPreviewDimension / bitmapHeight); + width = Math.floor(bitmapWidth * ratio); + height = Math.floor(bitmapHeight * ratio); + } + canvas = document.createElement("canvas"); + const scaledWidth = canvas.width = Math.ceil(width * outputScale.sx); + const scaledHeight = canvas.height = Math.ceil(height * outputScale.sy); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(scaledWidth, scaledHeight); + } + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + let white = "white", + black = "#cfcfd8"; + if (this._uiManager.hcmFilter !== "none") { + black = "black"; + } else if (ColorScheme.isDarkMode) { + white = "#8f8f9d"; + black = "#42414d"; + } + const boxDim = 15; + const boxDimWidth = boxDim * outputScale.sx; + const boxDimHeight = boxDim * outputScale.sy; + const pattern = new OffscreenCanvas(boxDimWidth * 2, boxDimHeight * 2); + const patternCtx = pattern.getContext("2d"); + patternCtx.fillStyle = white; + patternCtx.fillRect(0, 0, boxDimWidth * 2, boxDimHeight * 2); + patternCtx.fillStyle = black; + patternCtx.fillRect(0, 0, boxDimWidth, boxDimHeight); + patternCtx.fillRect(boxDimWidth, boxDimHeight, boxDimWidth, boxDimHeight); + ctx.fillStyle = ctx.createPattern(pattern, "repeat"); + ctx.fillRect(0, 0, scaledWidth, scaledHeight); + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + let imageData = null; + if (createImageData) { + let dataWidth, dataHeight; + if (outputScale.symmetric && bitmap.width < maxDataDimension && bitmap.height < maxDataDimension) { + dataWidth = bitmap.width; + dataHeight = bitmap.height; + } else { + bitmap = this.#bitmap; + if (bitmapWidth > maxDataDimension || bitmapHeight > maxDataDimension) { + const ratio = Math.min(maxDataDimension / bitmapWidth, maxDataDimension / bitmapHeight); + dataWidth = Math.floor(bitmapWidth * ratio); + dataHeight = Math.floor(bitmapHeight * ratio); + if (!this.#isSvg) { + bitmap = this.#scaleBitmap(dataWidth, dataHeight); + } + } + } + const offscreen = new OffscreenCanvas(dataWidth, dataHeight); + const offscreenCtx = offscreen.getContext("2d", { + willReadFrequently: true + }); + offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, dataWidth, dataHeight); + imageData = { + width: dataWidth, + height: dataHeight, + data: offscreenCtx.getImageData(0, 0, dataWidth, dataHeight).data + }; + } + return { + canvas, + width, + height, + imageData + }; + } + #scaleBitmap(width, height) { + const { + width: bitmapWidth, + height: bitmapHeight + } = this.#bitmap; + let newWidth = bitmapWidth; + let newHeight = bitmapHeight; + let bitmap = this.#bitmap; + while (newWidth > 2 * width || newHeight > 2 * height) { + const prevWidth = newWidth; + const prevHeight = newHeight; + if (newWidth > 2 * width) { + newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2); + } + if (newHeight > 2 * height) { + newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2); + } + const offscreen = new OffscreenCanvas(newWidth, newHeight); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight); + bitmap = offscreen.transferToImageBitmap(); + } + return bitmap; + } + #drawBitmap() { + const [parentWidth, parentHeight] = this.parentDimensions; + const { + width, + height + } = this; + const outputScale = new OutputScale(); + const scaledWidth = Math.ceil(width * parentWidth * outputScale.sx); + const scaledHeight = Math.ceil(height * parentHeight * outputScale.sy); + const canvas = this.#canvas; + if (!canvas || canvas.width === scaledWidth && canvas.height === scaledHeight) { + return; + } + canvas.width = scaledWidth; + canvas.height = scaledHeight; + const bitmap = this.#isSvg ? this.#bitmap : this.#scaleBitmap(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + ctx.filter = this._uiManager.hcmFilter; + ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, scaledWidth, scaledHeight); + } + #serializeBitmap(toUrl) { + if (toUrl) { + if (this.#isSvg) { + const url = this._uiManager.imageManager.getSvgUrl(this.#bitmapId); + if (url) { + return url; + } + } + const canvas = document.createElement("canvas"); + ({ + width: canvas.width, + height: canvas.height + } = this.#bitmap); + const ctx = canvas.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0); + return canvas.toDataURL(); + } + if (this.#isSvg) { + const [pageWidth, pageHeight] = this.pageDimensions; + const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS); + const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS); + const offscreen = new OffscreenCanvas(width, height); + const ctx = offscreen.getContext("2d"); + ctx.drawImage(this.#bitmap, 0, 0, this.#bitmap.width, this.#bitmap.height, 0, 0, width, height); + return offscreen.transferToImageBitmap(); + } + return structuredClone(this.#bitmap); + } + static async deserialize(data, parent, uiManager) { + let initialData = null; + let missingCanvas = false; + if (data instanceof StampAnnotationElement) { + const { + data: { + rect, + rotation, + id, + structParent, + popupRef, + richText, + contentsObj, + creationDate, + modificationDate + }, + container, + parent: { + page: { + pageNumber + } + }, + canvas + } = data; + let bitmapId, bitmap; + if (canvas) { + delete data.canvas; + ({ + id: bitmapId, + bitmap + } = uiManager.imageManager.getFromCanvas(container.id, canvas)); + canvas.remove(); + } else { + missingCanvas = true; + data._hasNoCanvas = true; + } + const altText = (await parent._structTree.getAriaAttributes(`${AnnotationPrefix}${id}`))?.get("aria-label") || ""; + initialData = data = { + annotationType: AnnotationEditorType.STAMP, + bitmapId, + bitmap, + pageIndex: pageNumber - 1, + rect: rect.slice(0), + rotation, + annotationElementId: id, + id, + deleted: false, + accessibilityData: { + decorative: false, + altText + }, + isSvg: false, + structParent, + popupRef, + richText, + comment: contentsObj?.str || null, + creationDate, + modificationDate + }; + } + const editor = await super.deserialize(data, parent, uiManager); + const { + rect, + bitmap, + bitmapUrl, + bitmapId, + isSvg, + accessibilityData + } = data; + if (missingCanvas) { + uiManager.addMissingCanvas(data.id, editor); + editor.#missingCanvas = true; + } else if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) { + editor.#bitmapId = bitmapId; + if (bitmap) { + editor.#bitmap = bitmap; + } + } else { + editor.#bitmapUrl = bitmapUrl; + } + editor.#isSvg = isSvg; + const [parentWidth, parentHeight] = editor.pageDimensions; + editor.width = (rect[2] - rect[0]) / parentWidth; + editor.height = (rect[3] - rect[1]) / parentHeight; + if (accessibilityData) { + editor.altTextData = accessibilityData; + } + editor._initialData = initialData; + if (data.comment) { + editor.setCommentData(data); + } + editor.#hasBeenAddedInUndoStack = !!initialData; + return editor; + } + serialize(isForCopying = false, context = null) { + if (this.isEmpty()) { + return null; + } + if (this.deleted) { + return this.serializeDeleted(); + } + const serialized = Object.assign(super.serialize(isForCopying), { + bitmapId: this.#bitmapId, + isSvg: this.#isSvg + }); + this.addComment(serialized); + if (isForCopying) { + serialized.bitmapUrl = this.#serializeBitmap(true); + serialized.accessibilityData = this.serializeAltText(true); + serialized.isCopy = true; + return serialized; + } + const { + decorative, + altText + } = this.serializeAltText(false); + if (!decorative && altText) { + serialized.accessibilityData = { + type: "Figure", + alt: altText + }; + } + if (this.annotationElementId) { + const changes = this.#hasElementChanged(serialized); + if (changes.isSame) { + return null; + } + if (changes.isSameAltText) { + delete serialized.accessibilityData; + } else { + serialized.accessibilityData.structParent = this._initialData.structParent ?? -1; + } + serialized.id = this.annotationElementId; + delete serialized.bitmapId; + return serialized; + } + if (context === null) { + return serialized; + } + context.stamps ||= new Map(); + const area = this.#isSvg ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null; + if (!context.stamps.has(this.#bitmapId)) { + context.stamps.set(this.#bitmapId, { + area, + serialized + }); + serialized.bitmap = this.#serializeBitmap(false); + } else if (this.#isSvg) { + const prevData = context.stamps.get(this.#bitmapId); + if (area > prevData.area) { + prevData.area = area; + prevData.serialized.bitmap.close(); + prevData.serialized.bitmap = this.#serializeBitmap(false); + } + } + return serialized; + } + #hasElementChanged(serialized) { + const { + pageIndex, + accessibilityData: { + altText + } + } = this._initialData; + const isSamePageIndex = serialized.pageIndex === pageIndex; + const isSameAltText = (serialized.accessibilityData?.alt || "") === altText; + return { + isSame: !this.hasEditedComment && !this._hasBeenMoved && !this._hasBeenResized && isSamePageIndex && isSameAltText, + isSameAltText + }; + } + renderAnnotationElement(annotation) { + if (this.deleted) { + annotation.hide(); + return null; + } + annotation.updateEdited({ + rect: this.getPDFRect(), + popup: this.comment + }); + return null; + } +} + +;// ./src/display/editor/annotation_editor_layer.js + + + + + + + + +class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; + #annotationLayer = null; + #clickAC = null; + #editorFocusTimeoutId = null; + #editors = new Map(); + #hadPointerDown = false; + #isDisabling = false; + #isEnabling = false; + #drawingAC = null; + #focusedElement = null; + #textLayer = null; + #textSelectionAC = null; + #textLayerDblClickAC = null; + #lastPointerDownTimestamp = -1; + #uiManager; + static _initialized = false; + static #editorTypes = new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor, SignatureEditor].map(type => [type._editorType, type])); + constructor({ + uiManager, + pageIndex, + div, + structTreeLayer, + accessibilityManager, + annotationLayer, + drawLayer, + textLayer, + viewport, + l10n + }) { + const editorTypes = [...AnnotationEditorLayer.#editorTypes.values()]; + if (!AnnotationEditorLayer._initialized) { + AnnotationEditorLayer._initialized = true; + for (const editorType of editorTypes) { + editorType.initialize(l10n, uiManager); + } + } + uiManager.registerEditorTypes(editorTypes); + this.#uiManager = uiManager; + this.pageIndex = pageIndex; + this.div = div; + this.#accessibilityManager = accessibilityManager; + this.#annotationLayer = annotationLayer; + this.viewport = viewport; + this.#textLayer = textLayer; + this.drawLayer = drawLayer; + this._structTree = structTreeLayer; + this.#uiManager.addLayer(this); + } + get isEmpty() { + return this.#editors.size === 0; + } + get isInvisible() { + return this.isEmpty && this.#uiManager.getMode() === AnnotationEditorType.NONE; + } + updateToolbar(options) { + this.#uiManager.updateToolbar(options); + } + updateMode(mode = this.#uiManager.getMode()) { + this.#cleanup(); + switch (mode) { + case AnnotationEditorType.NONE: + this.div.classList.toggle("nonEditing", true); + this.disableTextSelection(); + this.togglePointerEvents(false); + this.toggleAnnotationLayerPointerEvents(true); + this.disableClick(); + return; + case AnnotationEditorType.INK: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + break; + case AnnotationEditorType.HIGHLIGHT: + this.enableTextSelection(); + this.togglePointerEvents(false); + this.disableClick(); + break; + default: + this.disableTextSelection(); + this.togglePointerEvents(true); + this.enableClick(); + } + this.toggleAnnotationLayerPointerEvents(false); + const { + classList + } = this.div; + classList.toggle("nonEditing", false); + if (mode === AnnotationEditorType.POPUP) { + classList.toggle("commentEditing", true); + } else { + classList.toggle("commentEditing", false); + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType); + } + } + this.div.hidden = false; + } + hasTextLayer(textLayer) { + return textLayer === this.#textLayer?.div; + } + setEditingState(isEditing) { + this.#uiManager.setEditingState(isEditing); + } + addCommands(params) { + this.#uiManager.addCommands(params); + } + cleanUndoStack(type) { + this.#uiManager.cleanUndoStack(type); + } + toggleDrawing(enabled = false) { + this.div.classList.toggle("drawing", !enabled); + } + togglePointerEvents(enabled = false) { + this.div.classList.toggle("disabled", !enabled); + } + toggleAnnotationLayerPointerEvents(enabled = false) { + this.#annotationLayer?.div.classList.toggle("disabled", !enabled); + } + get #allEditorsIterator() { + return this.#editors.size !== 0 ? this.#editors.values() : this.#uiManager.getEditors(this.pageIndex); + } + async enable() { + this.#isEnabling = true; + this.div.tabIndex = 0; + this.togglePointerEvents(true); + this.div.classList.toggle("nonEditing", false); + this.#textLayerDblClickAC?.abort(); + this.#textLayerDblClickAC = null; + const annotationElementIds = new Set(); + for (const editor of this.#allEditorsIterator) { + editor.enableEditing(); + editor.show(true); + if (editor.annotationElementId) { + this.#uiManager.removeChangedExistingAnnotation(editor); + annotationElementIds.add(editor.annotationElementId); + } + } + const annotationLayer = this.#annotationLayer; + if (annotationLayer) { + for (const editable of annotationLayer.getEditableAnnotations()) { + editable.hide(); + if (this.#uiManager.isDeletedAnnotationElement(editable.data.id)) { + continue; + } + if (annotationElementIds.has(editable.data.id)) { + continue; + } + const editor = await this.deserialize(editable); + if (!editor) { + continue; + } + this.addOrRebuild(editor); + editor.enableEditing(); + } + } + this.#isEnabling = false; + this.#uiManager._eventBus.dispatch("editorsrendered", { + source: this, + pageNumber: this.pageIndex + 1 + }); + } + disable() { + this.#isDisabling = true; + this.div.tabIndex = -1; + this.togglePointerEvents(false); + this.div.classList.toggle("nonEditing", true); + if (this.#textLayer && !this.#textLayerDblClickAC) { + this.#textLayerDblClickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textLayerDblClickAC); + this.#textLayer.div.addEventListener("pointerdown", e => { + const DBL_CLICK_THRESHOLD = 500; + const { + clientX, + clientY, + timeStamp + } = e; + const lastPointerDownTimestamp = this.#lastPointerDownTimestamp; + if (timeStamp - lastPointerDownTimestamp > DBL_CLICK_THRESHOLD) { + this.#lastPointerDownTimestamp = timeStamp; + return; + } + this.#lastPointerDownTimestamp = -1; + const { + classList + } = this.div; + classList.toggle("getElements", true); + const elements = document.elementsFromPoint(clientX, clientY); + classList.toggle("getElements", false); + if (!this.div.contains(elements[0])) { + return; + } + let id; + const regex = new RegExp(`^${AnnotationEditorPrefix}[0-9]+$`); + for (const element of elements) { + if (regex.test(element.id)) { + id = element.id; + break; + } + } + if (!id) { + return; + } + const editor = this.#editors.get(id); + if (editor?.annotationElementId === null) { + e.stopPropagation(); + e.preventDefault(); + editor.dblclick(e); + } + }, { + signal, + capture: true + }); + } + const annotationLayer = this.#annotationLayer; + if (annotationLayer) { + const changedAnnotations = new Map(); + const resetAnnotations = new Map(); + for (const editor of this.#allEditorsIterator) { + editor.disableEditing(); + if (!editor.annotationElementId) { + editor.updateFakeAnnotationElement(annotationLayer); + continue; + } + if (editor.serialize() !== null) { + changedAnnotations.set(editor.annotationElementId, editor); + continue; + } else { + resetAnnotations.set(editor.annotationElementId, editor); + } + this.getEditableAnnotation(editor.annotationElementId)?.show(); + editor.remove(); + } + const editables = annotationLayer.getEditableAnnotations(); + for (const editable of editables) { + const { + id + } = editable.data; + if (this.#uiManager.isDeletedAnnotationElement(id)) { + editable.updateEdited({ + deleted: true + }); + continue; + } + let editor = resetAnnotations.get(id); + if (editor) { + editor.resetAnnotationElement(editable); + editor.show(false); + editable.show(); + continue; + } + editor = changedAnnotations.get(id); + if (editor) { + this.#uiManager.addChangedExistingAnnotation(editor); + if (editor.renderAnnotationElement(editable)) { + editor.show(false); + } + } + editable.show(); + } + } + this.#cleanup(); + if (this.isEmpty) { + this.div.hidden = true; + } + const { + classList + } = this.div; + for (const editorType of AnnotationEditorLayer.#editorTypes.values()) { + classList.remove(`${editorType._type}Editing`); + } + this.disableTextSelection(); + this.toggleAnnotationLayerPointerEvents(true); + this.#isDisabling = false; + } + getEditableAnnotation(id) { + return this.#annotationLayer?.getEditableAnnotation(id) || null; + } + setActiveEditor(editor) { + const currentActive = this.#uiManager.getActive(); + if (currentActive === editor) { + return; + } + this.#uiManager.setActiveEditor(editor); + } + enableTextSelection() { + this.div.tabIndex = -1; + if (this.#textLayer?.div && !this.#textSelectionAC) { + this.#textSelectionAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#textSelectionAC); + this.#textLayer.div.addEventListener("pointerdown", this.#textLayerPointerDown.bind(this), { + signal + }); + this.#textLayer.div.classList.add("highlighting"); + } + } + disableTextSelection() { + this.div.tabIndex = 0; + if (this.#textLayer?.div && this.#textSelectionAC) { + this.#textSelectionAC.abort(); + this.#textSelectionAC = null; + this.#textLayer.div.classList.remove("highlighting"); + } + } + #textLayerPointerDown(event) { + this.#uiManager.unselectAll(); + const { + target + } = event; + if (target === this.#textLayer.div || (target.getAttribute("role") === "img" || target.classList.contains("endOfContent")) && this.#textLayer.div.contains(target)) { + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + this.#uiManager.showAllEditors("highlight", true, true); + this.#textLayer.div.classList.add("free"); + this.toggleDrawing(); + HighlightEditor.startHighlighting(this, this.#uiManager.direction === "ltr", { + target: this.#textLayer.div, + x: event.x, + y: event.y + }); + this.#textLayer.div.addEventListener("pointerup", () => { + this.#textLayer.div.classList.remove("free"); + this.toggleDrawing(true); + }, { + once: true, + signal: this.#uiManager._signal + }); + event.preventDefault(); + } + } + enableClick() { + if (this.#clickAC) { + return; + } + this.#clickAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#clickAC); + this.div.addEventListener("pointerdown", this.pointerdown.bind(this), { + signal + }); + const pointerup = this.pointerup.bind(this); + this.div.addEventListener("pointerup", pointerup, { + signal + }); + this.div.addEventListener("pointercancel", pointerup, { + signal + }); + } + disableClick() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + attach(editor) { + this.#editors.set(editor.id, editor); + const { + annotationElementId + } = editor; + if (annotationElementId && this.#uiManager.isDeletedAnnotationElement(annotationElementId)) { + this.#uiManager.removeDeletedAnnotationElement(editor); + } + } + detach(editor) { + this.#editors.delete(editor.id); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); + if (!this.#isDisabling && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor); + } + } + remove(editor) { + this.detach(editor); + this.#uiManager.removeEditor(editor); + editor.div.remove(); + editor.isAttachedToDOM = false; + } + changeParent(editor) { + if (editor.parent === this) { + return; + } + if (editor.parent && editor.annotationElementId) { + this.#uiManager.addDeletedAnnotationElement(editor.annotationElementId); + AnnotationEditor.deleteAnnotationElement(editor); + editor.annotationElementId = null; + } + 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) { + if (editor.parent === this && editor.isAttachedToDOM) { + return; + } + this.changeParent(editor); + this.#uiManager.addEditor(editor); + this.attach(editor); + if (!editor.isAttachedToDOM) { + const div = editor.render(); + this.div.append(div); + editor.isAttachedToDOM = true; + } + editor.fixAndSetPosition(); + editor.onceAdded(!this.#isEnabling); + this.#uiManager.addToAnnotationStorage(editor); + editor._reportTelemetry(editor.telemetryInitialData); + } + moveEditorInDOM(editor) { + if (!editor.isAttachedToDOM) { + return; + } + const { + activeElement + } = document; + if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) { + editor._focusEventsAllowed = false; + this.#editorFocusTimeoutId = setTimeout(() => { + this.#editorFocusTimeoutId = null; + if (!editor.div.contains(document.activeElement)) { + editor.div.addEventListener("focusin", () => { + editor._focusEventsAllowed = true; + }, { + once: true, + signal: this.#uiManager._signal + }); + activeElement.focus(); + } else { + editor._focusEventsAllowed = true; + } + }, 0); + } + editor._structTreeParentId = this.#accessibilityManager?.moveElementInDOM(this.div, editor.div, editor.contentDiv, true); + } + addOrRebuild(editor) { + if (editor.needsToBeRebuilt()) { + editor.parent ||= this; + editor.rebuild(); + editor.show(); + } else { + this.add(editor); + } + } + addUndoableEditor(editor) { + const cmd = () => editor._uiManager.rebuild(editor); + const undo = () => { + editor.remove(); + }; + this.addCommands({ + cmd, + undo, + mustExec: false + }); + } + getEditorByUID(uid) { + for (const editor of this.#editors.values()) { + if (editor.uid === uid) { + return editor; + } + } + return null; + } + getNextId() { + return this.#uiManager.getId(); + } + get #currentEditorType() { + return AnnotationEditorLayer.#editorTypes.get(this.#uiManager.getMode()); + } + combinedSignal(ac) { + return this.#uiManager.combinedSignal(ac); + } + #createNewEditor(params) { + const editorType = this.#currentEditorType; + return editorType ? new editorType.prototype.constructor(params) : null; + } + canCreateNewEmptyEditor() { + return this.#currentEditorType?.canCreateNewEmptyEditor(); + } + async pasteEditor(options, params) { + this.updateToolbar(options); + await this.#uiManager.updateMode(options.mode); + const { + offsetX, + offsetY + } = this.#getCenterPoint(); + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: offsetX, + y: offsetY, + uiManager: this.#uiManager, + isCentered: true, + ...params + }); + if (editor) { + this.add(editor); + } + } + async deserialize(data) { + return (await AnnotationEditorLayer.#editorTypes.get(data.annotationType ?? data.annotationEditorType)?.deserialize(data, this, this.#uiManager)) || null; + } + createAndAddNewEditor(event, isCentered, data = {}) { + const id = this.getNextId(); + const editor = this.#createNewEditor({ + parent: this, + id, + x: event.offsetX, + y: event.offsetY, + uiManager: this.#uiManager, + isCentered, + ...data + }); + if (editor) { + this.add(editor); + } + return editor; + } + get boundingClientRect() { + return this.div.getBoundingClientRect(); + } + #getCenterPoint() { + const { + x, + y, + width, + height + } = this.boundingClientRect; + const tlX = Math.max(0, x); + const tlY = Math.max(0, y); + const brX = Math.min(window.innerWidth, x + width); + const brY = Math.min(window.innerHeight, y + height); + const centerX = (tlX + brX) / 2 - x; + const centerY = (tlY + brY) / 2 - y; + const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX]; + return { + offsetX, + offsetY + }; + } + addNewEditor(data = {}) { + this.createAndAddNewEditor(this.#getCenterPoint(), true, data); + } + setSelected(editor) { + this.#uiManager.setSelected(editor); + } + toggleSelected(editor) { + this.#uiManager.toggleSelected(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.#currentEditorType?.isDrawer && this.#currentEditorType.supportMultipleDrawings) { + return; + } + if (!this.#allowClick) { + this.#allowClick = true; + return; + } + const currentMode = this.#uiManager.getMode(); + if (currentMode === AnnotationEditorType.STAMP || currentMode === AnnotationEditorType.SIGNATURE) { + this.#uiManager.unselectAll(); + return; + } + this.createAndAddNewEditor(event, false); + } + pointerdown(event) { + if (this.#uiManager.getMode() === AnnotationEditorType.HIGHLIGHT) { + this.enableTextSelection(); + } + if (this.#hadPointerDown) { + this.#hadPointerDown = false; + return; + } + const { + isMac + } = util_FeatureTest.platform; + if (event.button !== 0 || event.ctrlKey && isMac) { + return; + } + if (event.target !== this.div) { + return; + } + this.#hadPointerDown = true; + if (this.#currentEditorType?.isDrawer) { + this.startDrawingSession(event); + return; + } + const editor = this.#uiManager.getActive(); + this.#allowClick = !editor || editor.isEmpty(); + } + startDrawingSession(event) { + this.div.focus({ + preventScroll: true + }); + if (this.#drawingAC) { + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + return; + } + this.#uiManager.setCurrentDrawingSession(this); + this.#drawingAC = new AbortController(); + const signal = this.#uiManager.combinedSignal(this.#drawingAC); + this.div.addEventListener("blur", ({ + relatedTarget + }) => { + if (relatedTarget && !this.div.contains(relatedTarget)) { + this.#focusedElement = null; + this.commitOrRemove(); + } + }, { + signal + }); + this.#currentEditorType.startDrawing(this, this.#uiManager, false, event); + } + pause(on) { + if (on) { + const { + activeElement + } = document; + if (this.div.contains(activeElement)) { + this.#focusedElement = activeElement; + } + return; + } + if (this.#focusedElement) { + setTimeout(() => { + this.#focusedElement?.focus(); + this.#focusedElement = null; + }, 0); + } + } + endDrawingSession(isAborted = false) { + if (!this.#drawingAC) { + return null; + } + this.#uiManager.setCurrentDrawingSession(null); + this.#drawingAC.abort(); + this.#drawingAC = null; + this.#focusedElement = null; + return this.#currentEditorType.endDrawing(isAborted); + } + findNewParent(editor, x, y) { + const layer = this.#uiManager.findParent(x, y); + if (layer === null || layer === this) { + return false; + } + layer.changeParent(editor); + return true; + } + commitOrRemove() { + if (this.#drawingAC) { + this.endDrawingSession(); + return true; + } + return false; + } + onScaleChanging() { + if (!this.#drawingAC) { + return; + } + this.#currentEditorType.onScaleChangingWhenDrawing(this); + } + destroy() { + this.commitOrRemove(); + if (this.#uiManager.getActive()?.parent === this) { + this.#uiManager.commitOrRemove(); + this.#uiManager.setActiveEditor(null); + } + if (this.#editorFocusTimeoutId) { + clearTimeout(this.#editorFocusTimeoutId); + this.#editorFocusTimeoutId = 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() { + for (const editor of this.#editors.values()) { + if (editor.isEmpty()) { + editor.remove(); + } + } + } + render({ + viewport + }) { + this.viewport = viewport; + setLayerDimensions(this.div, viewport); + for (const editor of this.#uiManager.getEditors(this.pageIndex)) { + this.add(editor); + editor.rebuild(); + } + this.updateMode(); + } + update({ + viewport + }) { + this.#uiManager.commitOrRemove(); + this.#cleanup(); + const oldRotation = this.viewport.rotation; + const rotation = viewport.rotation; + this.viewport = viewport; + setLayerDimensions(this.div, { + rotation + }); + if (oldRotation !== rotation) { + for (const editor of this.#editors.values()) { + editor.rotate(rotation); + } + } + } + get pageDimensions() { + const { + pageWidth, + pageHeight + } = this.viewport.rawDims; + return [pageWidth, pageHeight]; + } + get scale() { + return this.#uiManager.viewParameters.realScale; + } +} + +;// ./src/display/draw_layer.js + + +class DrawLayer { + #parent = null; + #mapping = new Map(); + #toUpdate = new Map(); + static #id = 0; + constructor({ + pageIndex + }) { + this.pageIndex = pageIndex; + } + setParent(parent) { + if (!this.#parent) { + this.#parent = parent; + return; + } + if (this.#parent !== parent) { + if (this.#mapping.size > 0) { + for (const root of this.#mapping.values()) { + root.remove(); + parent.append(root); + } + } + this.#parent = parent; + } + } + static get _svgFactory() { + return shadow(this, "_svgFactory", new DOMSVGFactory()); + } + static #setBox(element, [x, y, width, height]) { + const { + style + } = element; + style.top = `${100 * y}%`; + style.left = `${100 * x}%`; + style.width = `${100 * width}%`; + style.height = `${100 * height}%`; + } + #createSVG() { + const svg = DrawLayer._svgFactory.create(1, 1, true); + this.#parent.append(svg); + svg.setAttribute("aria-hidden", true); + return svg; + } + #createClipPath(defs, pathId) { + const clipPath = DrawLayer._svgFactory.createElement("clipPath"); + defs.append(clipPath); + const clipPathId = `clip_${pathId}`; + clipPath.setAttribute("id", clipPathId); + clipPath.setAttribute("clipPathUnits", "objectBoundingBox"); + const clipPathUse = DrawLayer._svgFactory.createElement("use"); + clipPath.append(clipPathUse); + clipPathUse.setAttribute("href", `#${pathId}`); + clipPathUse.classList.add("clip"); + return clipPathId; + } + #updateProperties(element, properties) { + for (const [key, value] of Object.entries(properties)) { + if (value === null) { + element.removeAttribute(key); + } else { + element.setAttribute(key, value); + } + } + } + draw(properties, isPathUpdatable = false, hasClip = false) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + if (isPathUpdatable) { + this.#toUpdate.set(id, path); + } + const clipPathId = hasClip ? this.#createClipPath(defs, pathId) : null; + const use = DrawLayer._svgFactory.createElement("use"); + root.append(use); + use.setAttribute("href", `#${pathId}`); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return { + id, + clipPathId: `url(#${clipPathId})` + }; + } + drawOutline(properties, mustRemoveSelfIntersections) { + const id = DrawLayer.#id++; + const root = this.#createSVG(); + const defs = DrawLayer._svgFactory.createElement("defs"); + root.append(defs); + const path = DrawLayer._svgFactory.createElement("path"); + defs.append(path); + const pathId = `path_p${this.pageIndex}_${id}`; + path.setAttribute("id", pathId); + path.setAttribute("vector-effect", "non-scaling-stroke"); + let maskId; + if (mustRemoveSelfIntersections) { + const mask = DrawLayer._svgFactory.createElement("mask"); + defs.append(mask); + maskId = `mask_p${this.pageIndex}_${id}`; + mask.setAttribute("id", maskId); + mask.setAttribute("maskUnits", "objectBoundingBox"); + const rect = DrawLayer._svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("fill", "white"); + const use = DrawLayer._svgFactory.createElement("use"); + mask.append(use); + use.setAttribute("href", `#${pathId}`); + use.setAttribute("stroke", "none"); + use.setAttribute("fill", "black"); + use.setAttribute("fill-rule", "nonzero"); + use.classList.add("mask"); + } + const use1 = DrawLayer._svgFactory.createElement("use"); + root.append(use1); + use1.setAttribute("href", `#${pathId}`); + if (maskId) { + use1.setAttribute("mask", `url(#${maskId})`); + } + const use2 = use1.cloneNode(); + root.append(use2); + use1.classList.add("mainOutline"); + use2.classList.add("secondaryOutline"); + this.updateProperties(root, properties); + this.#mapping.set(id, root); + return id; + } + finalizeDraw(id, properties) { + this.#toUpdate.delete(id); + this.updateProperties(id, properties); + } + updateProperties(elementOrId, properties) { + if (!properties) { + return; + } + const { + root, + bbox, + rootClass, + path + } = properties; + const element = typeof elementOrId === "number" ? this.#mapping.get(elementOrId) : elementOrId; + if (!element) { + return; + } + if (root) { + this.#updateProperties(element, root); + } + if (bbox) { + DrawLayer.#setBox(element, bbox); + } + if (rootClass) { + const { + classList + } = element; + for (const [className, value] of Object.entries(rootClass)) { + classList.toggle(className, value); + } + } + if (path) { + const defs = element.firstChild; + const pathElement = defs.firstChild; + this.#updateProperties(pathElement, path); + } + } + updateParent(id, layer) { + if (layer === this) { + return; + } + const root = this.#mapping.get(id); + if (!root) { + return; + } + layer.#parent.append(root); + this.#mapping.delete(id); + layer.#mapping.set(id, root); + } + remove(id) { + this.#toUpdate.delete(id); + if (this.#parent === null) { + return; + } + this.#mapping.get(id).remove(); + this.#mapping.delete(id); + } + destroy() { + this.#parent = null; + for (const root of this.#mapping.values()) { + root.remove(); + } + this.#mapping.clear(); + this.#toUpdate.clear(); + } +} + +;// ./src/pdf.js + + + + + + + + + + + + + + + + +{ + globalThis._pdfjsTestingUtils = { + HighlightOutliner: HighlightOutliner + }; +} +globalThis.pdfjsLib = { + AbortException: AbortException, + AnnotationEditorLayer: AnnotationEditorLayer, + AnnotationEditorParamsType: AnnotationEditorParamsType, + AnnotationEditorType: AnnotationEditorType, + AnnotationEditorUIManager: AnnotationEditorUIManager, + AnnotationLayer: AnnotationLayer, + AnnotationMode: AnnotationMode, + AnnotationType: AnnotationType, + applyOpacity: applyOpacity, + build: build, + ColorPicker: ColorPicker, + createValidAbsoluteUrl: createValidAbsoluteUrl, + CSSConstants: CSSConstants, + DOMSVGFactory: DOMSVGFactory, + DrawLayer: DrawLayer, + FeatureTest: util_FeatureTest, + fetchData: fetchData, + findContrastColor: findContrastColor, + getDocument: getDocument, + getFilenameFromUrl: getFilenameFromUrl, + getPdfFilenameFromUrl: getPdfFilenameFromUrl, + getRGB: getRGB, + getUuid: getUuid, + getXfaPageViewport: getXfaPageViewport, + GlobalWorkerOptions: GlobalWorkerOptions, + ImageKind: util_ImageKind, + InvalidPDFException: InvalidPDFException, + isDataScheme: isDataScheme, + isPdfFile: isPdfFile, + isValidExplicitDest: isValidExplicitDest, + MathClamp: MathClamp, + noContextMenu: noContextMenu, + normalizeUnicode: normalizeUnicode, + OPS: OPS, + OutputScale: OutputScale, + PasswordResponses: PasswordResponses, + PDFDataRangeTransport: PDFDataRangeTransport, + PDFDateString: PDFDateString, + PDFWorker: PDFWorker, + PermissionFlag: PermissionFlag, + PixelsPerInch: PixelsPerInch, + RenderingCancelledException: RenderingCancelledException, + renderRichText: renderRichText, + ResponseException: ResponseException, + setLayerDimensions: setLayerDimensions, + shadow: shadow, + SignatureExtractor: SignatureExtractor, + stopEvent: stopEvent, + SupportedImageMimeTypes: SupportedImageMimeTypes, + TextLayer: TextLayer, + TouchManager: TouchManager, + updateUrlHash: updateUrlHash, + Util: Util, + VerbosityLevel: VerbosityLevel, + version: version, + XfaLayer: XfaLayer +}; + +export { AbortException, AnnotationEditorLayer, AnnotationEditorParamsType, AnnotationEditorType, AnnotationEditorUIManager, AnnotationLayer, AnnotationMode, AnnotationType, CSSConstants, ColorPicker, DOMSVGFactory, DrawLayer, util_FeatureTest as FeatureTest, GlobalWorkerOptions, util_ImageKind as ImageKind, InvalidPDFException, MathClamp, OPS, OutputScale, PDFDataRangeTransport, PDFDateString, PDFWorker, PasswordResponses, PermissionFlag, PixelsPerInch, RenderingCancelledException, ResponseException, SignatureExtractor, SupportedImageMimeTypes, TextLayer, TouchManager, Util, VerbosityLevel, XfaLayer, applyOpacity, build, createValidAbsoluteUrl, fetchData, findContrastColor, getDocument, getFilenameFromUrl, getPdfFilenameFromUrl, getRGB, getUuid, getXfaPageViewport, isDataScheme, isPdfFile, isValidExplicitDest, noContextMenu, normalizeUnicode, renderRichText, setLayerDimensions, shadow, stopEvent, updateUrlHash, version }; + +//# sourceMappingURL=pdf.mjs.map \ No newline at end of file diff --git a/frontend/static/pdfjs/build/pdf.mjs.map b/frontend/static/pdfjs/build/pdf.mjs.map new file mode 100644 index 0000000..609bcad --- /dev/null +++ b/frontend/static/pdfjs/build/pdf.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"pdf.mjs","mappings":"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","sources":["webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/webpack/runtime/define property getters","webpack://pdf.js/webpack/runtime/hasOwnProperty shorthand","webpack://pdf.js/./src/shared/util.js","webpack://pdf.js/./src/display/xfa_text.js","webpack://pdf.js/./src/display/xfa_layer.js","webpack://pdf.js/./src/display/display_utils.js","webpack://pdf.js/./src/display/editor/toolbar.js","webpack://pdf.js/./src/display/editor/tools.js","webpack://pdf.js/./src/display/editor/alt_text.js","webpack://pdf.js/./src/display/editor/comment.js","webpack://pdf.js/./src/display/touch_manager.js","webpack://pdf.js/./src/display/editor/editor.js","webpack://pdf.js/./src/shared/murmurhash3.js","webpack://pdf.js/./src/display/annotation_storage.js","webpack://pdf.js/./src/display/font_loader.js","webpack://pdf.js/./src/display/api_utils.js","webpack://pdf.js/./src/shared/message_handler.js","webpack://pdf.js/./src/display/canvas_factory.js","webpack://pdf.js/./src/display/cmap_reader_factory.js","webpack://pdf.js/./src/display/filter_factory.js","webpack://pdf.js/./src/display/standard_fontdata_factory.js","webpack://pdf.js/./src/display/wasm_factory.js","webpack://pdf.js/./src/display/node_utils.js","webpack://pdf.js/./src/display/canvas_dependency_tracker.js","webpack://pdf.js/./src/display/pattern_helper.js","webpack://pdf.js/./src/shared/image_utils.js","webpack://pdf.js/./src/display/canvas.js","webpack://pdf.js/./src/shared/obj-bin-transform.js","webpack://pdf.js/./src/display/worker_options.js","webpack://pdf.js/./src/display/metadata.js","webpack://pdf.js/./src/display/optional_content_config.js","webpack://pdf.js/./src/display/transport_stream.js","webpack://pdf.js/./src/display/content_disposition.js","webpack://pdf.js/./src/display/network_utils.js","webpack://pdf.js/./src/display/fetch_stream.js","webpack://pdf.js/./src/display/network.js","webpack://pdf.js/./src/display/node_stream.js","webpack://pdf.js/./src/display/pdf_objects.js","webpack://pdf.js/./src/display/text_layer.js","webpack://pdf.js/./src/display/api.js","webpack://pdf.js/./src/display/editor/color_picker.js","webpack://pdf.js/./src/shared/scripting_utils.js","webpack://pdf.js/./src/display/svg_factory.js","webpack://pdf.js/./src/display/annotation_layer.js","webpack://pdf.js/./src/display/editor/freetext.js","webpack://pdf.js/./src/display/editor/drawers/outline.js","webpack://pdf.js/./src/display/editor/drawers/freedraw.js","webpack://pdf.js/./src/display/editor/drawers/highlight.js","webpack://pdf.js/./src/display/editor/highlight.js","webpack://pdf.js/./src/display/editor/draw.js","webpack://pdf.js/./src/display/editor/drawers/inkdraw.js","webpack://pdf.js/./src/display/editor/ink.js","webpack://pdf.js/./src/display/editor/drawers/contour.js","webpack://pdf.js/./src/display/editor/drawers/signaturedraw.js","webpack://pdf.js/./src/display/editor/signature.js","webpack://pdf.js/./src/display/editor/stamp.js","webpack://pdf.js/./src/display/editor/annotation_editor_layer.js","webpack://pdf.js/./src/display/draw_layer.js","webpack://pdf.js/./src/pdf.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* 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/* globals process */\n\n// NW.js / Electron is a browser context, but copies some Node.js objects; see\n// http://docs.nwjs.io/en/latest/For%20Users/Advanced/JavaScript%20Contexts%20in%20NW.js/#access-nodejs-and-nwjs-api-in-browser-context\n// https://www.electronjs.org/docs/api/process#processversionselectron-readonly\n// https://www.electronjs.org/docs/api/process#processtype-readonly\nconst isNodeJS =\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof process === \"object\" &&\n process + \"\" === \"[object process]\" &&\n !process.versions.nw &&\n !(process.versions.electron && process.type && process.type !== \"browser\");\n\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 * - SAVE is used, on the worker-thread, when saving modified annotations.\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 * - IS_EDITING is used when editing is active in the viewer.\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 IS_EDITING: 0x80,\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 HIGHLIGHT: 9,\n STAMP: 13,\n INK: 15,\n POPUP: 16,\n SIGNATURE: 101,\n COMMENT: 102,\n};\n\nconst AnnotationEditorParamsType = {\n RESIZE: 1,\n CREATE: 2,\n FREETEXT_SIZE: 11,\n FREETEXT_COLOR: 12,\n FREETEXT_OPACITY: 13,\n INK_COLOR: 21,\n INK_THICKNESS: 22,\n INK_OPACITY: 23,\n HIGHLIGHT_COLOR: 31,\n HIGHLIGHT_THICKNESS: 32,\n HIGHLIGHT_FREE: 33,\n HIGHLIGHT_SHOW_ALL: 34,\n DRAW_STEP: 41,\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 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\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 setStrokeTransparent: 92,\n setFillTransparent: 93,\n rawFillPath: 94,\n};\n\n// In order to have a switch statement that is fast (i.e. which use a jump\n// table), we need to have the OPS in a contiguous range.\nconst DrawOPS = {\n moveTo: 0,\n lineTo: 1,\n curveTo: 2,\n closePath: 3,\n};\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 // eslint-disable-next-line no-console\n console.info(`Info: ${msg}`);\n }\n}\n\n// Non-fatal warnings.\nfunction warn(msg) {\n if (verbosity >= VerbosityLevel.WARNINGS) {\n // eslint-disable-next-line no-console\n console.warn(`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 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 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?.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 {}\n }\n }\n\n const absoluteUrl = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n return _isValidProtocol(absoluteUrl) ? absoluteUrl : null;\n}\n\n/**\n * Remove, or replace, the hash property of the URL.\n *\n * @param {URL|string} url - The absolute, or relative, URL.\n * @param {string} hash - The hash property (use an empty string to remove it).\n * @param {boolean} [allowRel] - Allow relative URLs.\n * @returns {string} The resulting URL string.\n */\nfunction updateUrlHash(url, hash, allowRel = false) {\n const res = URL.parse(url);\n if (res) {\n res.hash = hash;\n return res.href;\n }\n // Support well-formed relative URLs, necessary for `web/app.js` in GENERIC\n // builds, by optionally falling back to string parsing.\n if (allowRel && createValidAbsoluteUrl(url, \"http://example.com\")) {\n return url.split(\"#\", 1)[0] + `${hash ? `#${hash}` : \"\"}`;\n }\n return \"\";\n}\n\nfunction shadow(obj, prop, value, nonSerializable = false) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\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 (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseException\n ) {\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 ResponseException extends BaseException {\n constructor(msg, status, missing) {\n super(msg, \"ResponseException\");\n this.status = status;\n this.missing = missing;\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 (typeof bytes !== \"object\" || bytes?.length === undefined) {\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\nfunction string32(value) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\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// 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 {\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 isImageDecoderSupported() {\n return shadow(\n this,\n \"isImageDecoderSupported\",\n typeof ImageDecoder !== \"undefined\"\n );\n }\n\n static get platform() {\n const { platform, userAgent } = navigator;\n\n return shadow(this, \"platform\", {\n isAndroid: userAgent.includes(\"Android\"),\n isLinux: platform.includes(\"Linux\"),\n isMac: platform.includes(\"Mac\"),\n isWindows: platform.includes(\"Win\"),\n isFirefox:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n userAgent.includes(\"Firefox\"),\n });\n }\n\n static get isCSSRoundSupported() {\n return shadow(\n this,\n \"isCSSRoundSupported\",\n globalThis.CSS?.supports?.(\"width: round(1.5px, 1px)\")\n );\n }\n}\n\nconst hexNumbers = Array.from(Array(256).keys(), 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 static domMatrixToTransform(dm) {\n return [dm.a, dm.b, dm.c, dm.d, dm.e, dm.f];\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 // swapped.\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[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[0];\n minMax[2] *= transform[0];\n\n if (transform[3] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[3];\n minMax[3] *= transform[3];\n } else {\n temp = minMax[0];\n minMax[0] = minMax[1];\n minMax[1] = temp;\n temp = minMax[2];\n minMax[2] = minMax[3];\n minMax[3] = temp;\n\n if (transform[1] < 0) {\n temp = minMax[1];\n minMax[1] = minMax[3];\n minMax[3] = temp;\n }\n minMax[1] *= transform[1];\n minMax[3] *= transform[1];\n\n if (transform[2] < 0) {\n temp = minMax[0];\n minMax[0] = minMax[2];\n minMax[2] = temp;\n }\n minMax[0] *= transform[2];\n minMax[2] *= transform[2];\n }\n minMax[0] += transform[4];\n minMax[1] += transform[5];\n minMax[2] += transform[4];\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 // Multiplies m (an array-based transform) by md (a DOMMatrix transform).\n static multiplyByDOMMatrix(m, md) {\n return [\n m[0] * md.a + m[2] * md.b,\n m[1] * md.a + m[3] * md.b,\n m[0] * md.c + m[2] * md.d,\n m[1] * md.c + m[3] * md.d,\n m[0] * md.e + m[2] * md.f + m[4],\n m[1] * md.e + m[3] * md.f + m[5],\n ];\n }\n\n // For 2d affine transforms\n static applyTransform(p, m, pos = 0) {\n const p0 = p[pos];\n const p1 = p[pos + 1];\n p[pos] = p0 * m[0] + p1 * m[2] + m[4];\n p[pos + 1] = p0 * m[1] + p1 * m[3] + m[5];\n }\n\n static applyTransformToBezier(p, transform, pos = 0) {\n const m0 = transform[0];\n const m1 = transform[1];\n const m2 = transform[2];\n const m3 = transform[3];\n const m4 = transform[4];\n const m5 = transform[5];\n for (let i = 0; i < 6; i += 2) {\n const pI = p[pos + i];\n const pI1 = p[pos + i + 1];\n p[pos + i] = pI * m0 + pI1 * m2 + m4;\n p[pos + i + 1] = pI * m1 + pI1 * m3 + m5;\n }\n }\n\n static applyInverseTransform(p, m) {\n const p0 = p[0];\n const p1 = p[1];\n const d = m[0] * m[3] - m[1] * m[2];\n p[0] = (p0 * m[3] - p1 * m[2] + m[2] * m[5] - m[4] * m[3]) / d;\n p[1] = (-p0 * m[1] + p1 * m[0] + m[4] * m[1] - m[5] * m[0]) / d;\n }\n\n // Applies the transform to the rectangle and finds the minimum axially\n // aligned bounding box.\n static axialAlignedBoundingBox(rect, transform, output) {\n const m0 = transform[0];\n const m1 = transform[1];\n const m2 = transform[2];\n const m3 = transform[3];\n const m4 = transform[4];\n const m5 = transform[5];\n const r0 = rect[0];\n const r1 = rect[1];\n const r2 = rect[2];\n const r3 = rect[3];\n\n let a0 = m0 * r0 + m4;\n let a2 = a0;\n let a1 = m0 * r2 + m4;\n let a3 = a1;\n let b0 = m3 * r1 + m5;\n let b2 = b0;\n let b1 = m3 * r3 + m5;\n let b3 = b1;\n\n if (m1 !== 0 || m2 !== 0) {\n // Non-scaling matrix: shouldn't be frequent.\n const m1r0 = m1 * r0;\n const m1r2 = m1 * r2;\n const m2r1 = m2 * r1;\n const m2r3 = m2 * r3;\n a0 += m2r1;\n a3 += m2r1;\n a1 += m2r3;\n a2 += m2r3;\n b0 += m1r0;\n b3 += m1r0;\n b1 += m1r2;\n b2 += m1r2;\n }\n\n output[0] = Math.min(output[0], a0, a1, a2, a3);\n output[1] = Math.min(output[1], b0, b1, b2, b3);\n output[2] = Math.max(output[2], a0, a1, a2, a3);\n output[3] = Math.max(output[3], b0, b1, b2, b3);\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(matrix, output) {\n const m0 = matrix[0];\n const m1 = matrix[1];\n const m2 = matrix[2];\n const m3 = matrix[3];\n // Multiply matrix m with its transpose.\n const a = m0 ** 2 + m1 ** 2;\n const b = m0 * m2 + m1 * m3;\n const c = m2 ** 2 + m3 ** 2;\n\n // Solve the second degree polynomial to get roots.\n const first = (a + c) / 2;\n const second = Math.sqrt(first ** 2 - (a * c - b ** 2));\n output[0] = Math.sqrt(first + second || 1);\n output[1] = Math.sqrt(first - second || 1);\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 static pointBoundingBox(x, y, minMax) {\n minMax[0] = Math.min(minMax[0], x);\n minMax[1] = Math.min(minMax[1], y);\n minMax[2] = Math.max(minMax[2], x);\n minMax[3] = Math.max(minMax[3], y);\n }\n\n static rectBoundingBox(x0, y0, x1, y1, minMax) {\n minMax[0] = Math.min(minMax[0], x0, x1);\n minMax[1] = Math.min(minMax[1], y0, y1);\n minMax[2] = Math.max(minMax[2], x0, x1);\n minMax[3] = Math.max(minMax[3], y0, y1);\n }\n\n static #getExtremumOnCurve(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {\n if (t <= 0 || t >= 1) {\n return;\n }\n const mt = 1 - t;\n const tt = t * t;\n const ttt = tt * t;\n const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;\n const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;\n minMax[0] = Math.min(minMax[0], x);\n minMax[1] = Math.min(minMax[1], y);\n minMax[2] = Math.max(minMax[2], x);\n minMax[3] = Math.max(minMax[3], y);\n }\n\n static #getExtremum(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {\n if (Math.abs(a) < 1e-12) {\n if (Math.abs(b) >= 1e-12) {\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n -c / b,\n minMax\n );\n }\n return;\n }\n\n const delta = b ** 2 - 4 * c * a;\n if (delta < 0) {\n return;\n }\n const sqrtDelta = Math.sqrt(delta);\n const a2 = 2 * a;\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b + sqrtDelta) / a2,\n minMax\n );\n this.#getExtremumOnCurve(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n (-b - sqrtDelta) / a2,\n minMax\n );\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, minMax) {\n minMax[0] = Math.min(minMax[0], x0, x3);\n minMax[1] = Math.min(minMax[1], y0, y3);\n minMax[2] = Math.max(minMax[2], x0, x3);\n minMax[3] = Math.max(minMax[3], y0, y3);\n\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-x0 + 3 * (x1 - x2) + x3),\n 6 * (x0 - 2 * x1 + x2),\n 3 * (x1 - x0),\n minMax\n );\n this.#getExtremum(\n x0,\n x1,\n x2,\n x3,\n y0,\n y1,\n y2,\n y3,\n 3 * (-y0 + 3 * (y1 - y2) + y3),\n 6 * (y0 - 2 * y1 + y2),\n 3 * (y1 - y0),\n minMax\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, keepEscapeSequence = false) {\n // See section 7.9.2.2 Text String Type.\n // The string can contain some language codes bracketed with 0x1b,\n // so we must remove them.\n if (str[0] >= \"\\xEF\") {\n let encoding;\n if (str[0] === \"\\xFE\" && str[1] === \"\\xFF\") {\n encoding = \"utf-16be\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\n } else if (str[0] === \"\\xFF\" && str[1] === \"\\xFE\") {\n encoding = \"utf-16le\";\n if (str.length % 2 === 1) {\n str = str.slice(0, -1);\n }\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 const decoded = decoder.decode(buffer);\n if (keepEscapeSequence || !decoded.includes(\"\\x1b\")) {\n return decoded;\n }\n return decoded.replaceAll(/\\x1b[^\\x1b]*(?:\\x1b|$)/g, \"\");\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 charCode = str.charCodeAt(i);\n if (!keepEscapeSequence && charCode === 0x1b) {\n // eslint-disable-next-line no-empty\n while (++i < ii && str.charCodeAt(i) !== 0x1b) {}\n continue;\n }\n const code = PDFStringTranslateTable[charCode];\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 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 if (!(date instanceof Date)) {\n date = new Date(date);\n }\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\nlet NormalizeRegex = null;\nlet NormalizationMap = null;\nfunction normalizeUnicode(str) {\n if (!NormalizeRegex) {\n // In order to generate the following regex:\n // - create a PDF containing all the chars in the range 0000-FFFF with\n // a NFKC which is different of the char.\n // - copy and paste all those chars and get the ones where NFKC is\n // required.\n // It appears that most the chars here contain some ligatures.\n NormalizeRegex =\n /([\\u00a0\\u00b5\\u037e\\u0eb3\\u2000-\\u200a\\u202f\\u2126\\ufb00-\\ufb04\\ufb06\\ufb20-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufba1\\ufba4-\\ufba9\\ufbae-\\ufbb1\\ufbd3-\\ufbdc\\ufbde-\\ufbe7\\ufbea-\\ufbf8\\ufbfc-\\ufbfd\\ufc00-\\ufc5d\\ufc64-\\ufcf1\\ufcf5-\\ufd3d\\ufd88\\ufdf4\\ufdfa-\\ufdfb\\ufe71\\ufe77\\ufe79\\ufe7b\\ufe7d]+)|(\\ufb05+)/gu;\n NormalizationMap = new Map([[\"ſt\", \"ſt\"]]);\n }\n return str.replaceAll(NormalizeRegex, (_, p1, p2) =>\n p1 ? p1.normalize(\"NFKC\") : NormalizationMap.get(p2)\n );\n}\n\nfunction getUuid() {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n typeof crypto.randomUUID === \"function\"\n ) {\n return crypto.randomUUID();\n }\n const buf = new Uint8Array(32);\n crypto.getRandomValues(buf);\n return bytesToString(buf);\n}\n\nconst AnnotationPrefix = \"pdfjs_internal_id_\";\n\nfunction _isValidExplicitDest(validRef, validName, dest) {\n if (!Array.isArray(dest) || dest.length < 2) {\n return false;\n }\n const [page, zoom, ...args] = dest;\n if (!validRef(page) && !Number.isInteger(page)) {\n return false;\n }\n if (!validName(zoom)) {\n return false;\n }\n const argsLen = args.length;\n let allowNull = true;\n switch (zoom.name) {\n case \"XYZ\":\n if (argsLen < 2 || argsLen > 3) {\n return false;\n }\n break;\n case \"Fit\":\n case \"FitB\":\n return argsLen === 0;\n case \"FitH\":\n case \"FitBH\":\n case \"FitV\":\n case \"FitBV\":\n if (argsLen > 1) {\n return false;\n }\n break;\n case \"FitR\":\n if (argsLen !== 4) {\n return false;\n }\n allowNull = false;\n break;\n default:\n return false;\n }\n for (const arg of args) {\n if (typeof arg === \"number\" || (allowNull && arg === null)) {\n continue;\n }\n return false;\n }\n return true;\n}\n\n// TODO: Replace all occurrences of this function with `Math.clamp` once\n// https://github.com/tc39/proposal-math-clamp/ is generally available.\nfunction MathClamp(v, min, max) {\n return Math.min(Math.max(v, min), max);\n}\n\n// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available.\nfunction toHexUtil(arr) {\n if (Uint8Array.prototype.toHex) {\n return arr.toHex();\n }\n return Array.from(arr, num => hexNumbers[num]).join(\"\");\n}\n\n// TODO: Remove this once `Uint8Array.prototype.toBase64` is generally\n// available.\nfunction toBase64Util(arr) {\n if (Uint8Array.prototype.toBase64) {\n return arr.toBase64();\n }\n return btoa(bytesToString(arr));\n}\n\n// TODO: Remove this once `Uint8Array.fromBase64` is generally available.\nfunction fromBase64Util(str) {\n if (Uint8Array.fromBase64) {\n return Uint8Array.fromBase64(str);\n }\n return stringToBytes(atob(str));\n}\n\n// TODO: Remove this once https://bugzilla.mozilla.org/show_bug.cgi?id=1928493\n// is fixed.\nif (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) &&\n typeof Promise.try !== \"function\"\n) {\n Promise.try = function (fn, ...args) {\n return new Promise(resolve => {\n resolve(fn(...args));\n });\n };\n}\n\n// TODO: Remove this once the `javascript.options.experimental.math_sumprecise`\n// preference is removed from Firefox.\nif (typeof Math.sumPrecise !== \"function\") {\n // Note that this isn't a \"proper\" polyfill, but since we're only using it to\n // replace `Array.prototype.reduce()` invocations it should be fine.\n Math.sumPrecise = function (numbers) {\n return numbers.reduce((a, b) => a + b, 0);\n };\n}\n\nif (\n typeof PDFJSDev !== \"undefined\" &&\n !PDFJSDev.test(\"SKIP_BABEL\") &&\n typeof AbortSignal.any !== \"function\"\n) {\n AbortSignal.any = function (iterable) {\n const ac = new AbortController();\n const { signal } = ac;\n\n // Return immediately if any of the signals are already aborted.\n for (const s of iterable) {\n if (s.aborted) {\n ac.abort(s.reason);\n return signal;\n }\n }\n // Register \"abort\" listeners for all signals.\n for (const s of iterable) {\n s.addEventListener(\n \"abort\",\n () => {\n ac.abort(s.reason);\n },\n { signal } // Automatically remove the listener.\n );\n }\n\n return signal;\n };\n}\n\nexport {\n _isValidExplicitDest,\n AbortException,\n AnnotationActionEventType,\n AnnotationBorderStyleType,\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n AnnotationFieldFlag,\n AnnotationFlag,\n AnnotationMode,\n AnnotationPrefix,\n AnnotationReplyType,\n AnnotationType,\n assert,\n BaseException,\n BASELINE_FACTOR,\n bytesToString,\n createValidAbsoluteUrl,\n DocumentActionEventType,\n DrawOPS,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n FormatError,\n fromBase64Util,\n getModificationDate,\n getUuid,\n getVerbosityLevel,\n hexNumbers,\n ImageKind,\n info,\n InvalidPDFException,\n isArrayEqual,\n isNodeJS,\n LINE_DESCENT_FACTOR,\n LINE_FACTOR,\n MathClamp,\n normalizeUnicode,\n objectSize,\n OPS,\n PageActionEventType,\n PasswordException,\n PasswordResponses,\n PermissionFlag,\n RenderingIntentFlag,\n ResponseException,\n setVerbosityLevel,\n shadow,\n string32,\n stringToBytes,\n stringToPDFString,\n stringToUTF8String,\n TextRenderingMode,\n toBase64Util,\n toHexUtil,\n UnknownErrorException,\n unreachable,\n updateUrlHash,\n utf8StringToString,\n Util,\n VerbosityLevel,\n warn,\n};\n","/* Copyright 2021 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/** @typedef {import(\"./api\").TextContent} TextContent */\n\nclass XfaText {\n /**\n * Walk an XFA tree and create an array of text nodes that is compatible\n * with a regular PDFs TextContent. Currently, only TextItem.str is supported,\n * all other fields and styles haven't been implemented.\n *\n * @param {Object} xfa - An XFA fake DOM object.\n *\n * @returns {TextContent}\n */\n static textContent(xfa) {\n const items = [];\n const output = {\n items,\n styles: Object.create(null),\n };\n function walk(node) {\n if (!node) {\n return;\n }\n let str = null;\n const name = node.name;\n if (name === \"#text\") {\n str = node.value;\n } else if (!XfaText.shouldBuildText(name)) {\n return;\n } else if (node?.attributes?.textContent) {\n str = node.attributes.textContent;\n } else if (node.value) {\n str = node.value;\n }\n if (str !== null) {\n items.push({\n str,\n });\n }\n if (!node.children) {\n return;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n walk(xfa);\n return output;\n }\n\n /**\n * @param {string} name - DOM node name. (lower case)\n *\n * @returns {boolean} true if the DOM node should have a corresponding text\n * node.\n */\n static shouldBuildText(name) {\n return !(\n name === \"textarea\" ||\n name === \"input\" ||\n name === \"option\" ||\n name === \"select\"\n );\n }\n}\n\nexport { XfaText };\n","/* Copyright 2021 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// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_storage\").AnnotationStorage} AnnotationStorage */\n/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"../../web/interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { XfaText } from \"./xfa_text.js\";\n\n/**\n * @typedef {Object} XfaLayerParameters\n * @property {PageViewport} viewport\n * @property {HTMLDivElement} div\n * @property {Object} xfaHtml\n * @property {AnnotationStorage} [annotationStorage]\n * @property {IPDFLinkService} linkService\n * @property {string} [intent] - (default value is 'display').\n */\n\nclass XfaLayer {\n static setupStorage(html, id, element, storage, intent) {\n const storedData = storage.getValue(id, { value: null });\n switch (element.name) {\n case \"textarea\":\n if (storedData.value !== null) {\n html.textContent = storedData.value;\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"input\", event => {\n storage.setValue(id, { value: event.target.value });\n });\n break;\n case \"input\":\n if (\n element.attributes.type === \"radio\" ||\n element.attributes.type === \"checkbox\"\n ) {\n if (storedData.value === element.attributes.xfaOn) {\n html.setAttribute(\"checked\", true);\n } else if (storedData.value === element.attributes.xfaOff) {\n // The checked attribute may have been set when opening the file,\n // unset through the UI and we're here because of printing.\n html.removeAttribute(\"checked\");\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"change\", event => {\n storage.setValue(id, {\n value: event.target.checked\n ? event.target.getAttribute(\"xfaOn\")\n : event.target.getAttribute(\"xfaOff\"),\n });\n });\n } else {\n if (storedData.value !== null) {\n html.setAttribute(\"value\", storedData.value);\n }\n if (intent === \"print\") {\n break;\n }\n html.addEventListener(\"input\", event => {\n storage.setValue(id, { value: event.target.value });\n });\n }\n break;\n case \"select\":\n if (storedData.value !== null) {\n html.setAttribute(\"value\", storedData.value);\n for (const option of element.children) {\n if (option.attributes.value === storedData.value) {\n option.attributes.selected = true;\n } else if (option.attributes.hasOwnProperty(\"selected\")) {\n delete option.attributes.selected;\n }\n }\n }\n html.addEventListener(\"input\", event => {\n const options = event.target.options;\n const value =\n options.selectedIndex === -1\n ? \"\"\n : options[options.selectedIndex].value;\n storage.setValue(id, { value });\n });\n break;\n }\n }\n\n static setAttributes({ html, element, storage = null, intent, linkService }) {\n const { attributes } = element;\n const isHTMLAnchorElement = html instanceof HTMLAnchorElement;\n\n if (attributes.type === \"radio\") {\n // Avoid to have a radio group when printing with the same as one\n // already displayed.\n attributes.name = `${attributes.name}-${intent}`;\n }\n for (const [key, value] of Object.entries(attributes)) {\n if (value === null || value === undefined) {\n continue;\n }\n\n switch (key) {\n case \"class\":\n if (value.length) {\n html.setAttribute(key, value.join(\" \"));\n }\n break;\n case \"dataId\":\n // We don't need to add dataId in the html object but it can\n // be useful to know its value when writing printing tests:\n // in this case, don't skip dataId to have its value.\n break;\n case \"id\":\n html.setAttribute(\"data-element-id\", value);\n break;\n case \"style\":\n Object.assign(html.style, value);\n break;\n case \"textContent\":\n html.textContent = value;\n break;\n default:\n if (!isHTMLAnchorElement || (key !== \"href\" && key !== \"newWindow\")) {\n html.setAttribute(key, value);\n }\n }\n }\n\n if (isHTMLAnchorElement) {\n linkService.addLinkAttributes(\n html,\n attributes.href,\n attributes.newWindow\n );\n }\n\n // Set the value after the others to be sure to overwrite any other values.\n if (storage && attributes.dataId) {\n this.setupStorage(html, attributes.dataId, element, storage);\n }\n }\n\n /**\n * Render the XFA layer.\n *\n * @param {XfaLayerParameters} parameters\n */\n static render(parameters) {\n const storage = parameters.annotationStorage;\n const linkService = parameters.linkService;\n const root = parameters.xfaHtml;\n const intent = parameters.intent || \"display\";\n const rootHtml = document.createElement(root.name);\n if (root.attributes) {\n this.setAttributes({\n html: rootHtml,\n element: root,\n intent,\n linkService,\n });\n }\n\n const isNotForRichText = intent !== \"richText\";\n const rootDiv = parameters.div;\n rootDiv.append(rootHtml);\n\n if (parameters.viewport) {\n const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n rootDiv.style.transform = transform;\n }\n\n // Set defaults.\n if (isNotForRichText) {\n rootDiv.setAttribute(\"class\", \"xfaLayer xfaFont\");\n }\n\n // Text nodes used for the text highlighter.\n const textDivs = [];\n\n // In the rich text context, it's possible to just have a text node without\n // a root element, so we handle this case here (see issue 17215).\n if (root.children.length === 0) {\n if (root.value) {\n const node = document.createTextNode(root.value);\n rootHtml.append(node);\n if (isNotForRichText && XfaText.shouldBuildText(root.name)) {\n textDivs.push(node);\n }\n }\n return { textDivs };\n }\n\n const stack = [[root, -1, rootHtml]];\n\n while (stack.length > 0) {\n const [parent, i, html] = stack.at(-1);\n if (i + 1 === parent.children.length) {\n stack.pop();\n continue;\n }\n\n const child = parent.children[++stack.at(-1)[1]];\n if (child === null) {\n continue;\n }\n\n const { name } = child;\n if (name === \"#text\") {\n const node = document.createTextNode(child.value);\n textDivs.push(node);\n html.append(node);\n continue;\n }\n\n const childHtml = child?.attributes?.xmlns\n ? document.createElementNS(child.attributes.xmlns, name)\n : document.createElement(name);\n\n html.append(childHtml);\n if (child.attributes) {\n this.setAttributes({\n html: childHtml,\n element: child,\n storage,\n intent,\n linkService,\n });\n }\n\n if (child.children?.length > 0) {\n stack.push([child, -1, childHtml]);\n } else if (child.value) {\n const node = document.createTextNode(child.value);\n if (isNotForRichText && XfaText.shouldBuildText(name)) {\n textDivs.push(node);\n }\n childHtml.append(node);\n }\n }\n\n /**\n * TODO: re-enable that stuff once we've JS implementation.\n * See https://bugzilla.mozilla.org/show_bug.cgi?id=1719465.\n *\n * for (const el of rootDiv.querySelectorAll(\n * \".xfaDisabled input, .xfaDisabled textarea\"\n * )) {\n * el.setAttribute(\"disabled\", true);\n * }\n * for (const el of rootDiv.querySelectorAll(\n * \".xfaReadOnly input, .xfaReadOnly textarea\"\n * )) {\n * el.setAttribute(\"readOnly\", true);\n * }\n */\n\n for (const el of rootDiv.querySelectorAll(\n \".xfaNonInteractive input, .xfaNonInteractive textarea\"\n )) {\n el.setAttribute(\"readOnly\", true);\n }\n\n return {\n textDivs,\n };\n }\n\n /**\n * Update the XFA layer.\n *\n * @param {XfaLayerParameters} parameters\n */\n static update(parameters) {\n const transform = `matrix(${parameters.viewport.transform.join(\",\")})`;\n parameters.div.style.transform = transform;\n parameters.div.hidden = false;\n }\n}\n\nexport { XfaLayer };\n","/* Copyright 2015 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\nimport {\n BaseException,\n FeatureTest,\n shadow,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport { XfaLayer } from \"./xfa_layer.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nclass PixelsPerInch {\n static CSS = 96.0;\n\n static PDF = 72.0;\n\n static PDF_TO_CSS_UNITS = this.CSS / this.PDF;\n}\n\nasync function fetchData(url, type = \"text\") {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n isValidFetchUrl(url, document.baseURI)\n ) {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(response.statusText);\n }\n switch (type) {\n case \"arraybuffer\":\n return response.arrayBuffer();\n case \"blob\":\n return response.blob();\n case \"json\":\n return response.json();\n }\n return response.text();\n }\n\n // The Fetch API is not supported.\n return new Promise((resolve, reject) => {\n const request = new XMLHttpRequest();\n request.open(\"GET\", url, /* async = */ true);\n request.responseType = type;\n\n request.onreadystatechange = () => {\n if (request.readyState !== XMLHttpRequest.DONE) {\n return;\n }\n if (request.status === 200 || request.status === 0) {\n switch (type) {\n case \"arraybuffer\":\n case \"blob\":\n case \"json\":\n resolve(request.response);\n return;\n }\n resolve(request.responseText);\n return;\n }\n reject(new Error(request.statusText));\n };\n\n request.send(null);\n });\n}\n\n/**\n * @typedef {Object} PageViewportParameters\n * @property {Array} viewBox - The xMin, yMin, xMax and\n * yMax coordinates.\n * @property {number} userUnit - The size of units.\n * @property {number} scale - The scale of the viewport.\n * @property {number} rotation - The rotation, in degrees, of the viewport.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset. The\n * default value is `0`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset. The\n * default value is `0`.\n * @property {boolean} [dontFlip] - If true, the y-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * @typedef {Object} PageViewportCloneParameters\n * @property {number} [scale] - The scale, overriding the one in the cloned\n * viewport. The default value is `this.scale`.\n * @property {number} [rotation] - The rotation, in degrees, overriding the one\n * in the cloned viewport. The default value is `this.rotation`.\n * @property {number} [offsetX] - The horizontal, i.e. x-axis, offset.\n * The default value is `this.offsetX`.\n * @property {number} [offsetY] - The vertical, i.e. y-axis, offset.\n * The default value is `this.offsetY`.\n * @property {boolean} [dontFlip] - If true, the x-axis will not be flipped.\n * The default value is `false`.\n */\n\n/**\n * PDF page viewport created based on scale, rotation and offset.\n */\nclass PageViewport {\n /**\n * @param {PageViewportParameters}\n */\n constructor({\n viewBox,\n userUnit,\n scale,\n rotation,\n offsetX = 0,\n offsetY = 0,\n dontFlip = false,\n }) {\n this.viewBox = viewBox;\n this.userUnit = userUnit;\n this.scale = scale;\n this.rotation = rotation;\n this.offsetX = offsetX;\n this.offsetY = offsetY;\n\n scale *= userUnit; // Take the userUnit into account.\n\n // creating transform to convert pdf coordinate system to the normal\n // canvas like coordinates taking in account scale and rotation\n const centerX = (viewBox[2] + viewBox[0]) / 2;\n const centerY = (viewBox[3] + viewBox[1]) / 2;\n let rotateA, rotateB, rotateC, rotateD;\n // Normalize the rotation, by clamping it to the [0, 360) range.\n rotation %= 360;\n if (rotation < 0) {\n rotation += 360;\n }\n switch (rotation) {\n case 180:\n rotateA = -1;\n rotateB = 0;\n rotateC = 0;\n rotateD = 1;\n break;\n case 90:\n rotateA = 0;\n rotateB = 1;\n rotateC = 1;\n rotateD = 0;\n break;\n case 270:\n rotateA = 0;\n rotateB = -1;\n rotateC = -1;\n rotateD = 0;\n break;\n case 0:\n rotateA = 1;\n rotateB = 0;\n rotateC = 0;\n rotateD = -1;\n break;\n default:\n throw new Error(\n \"PageViewport: Invalid rotation, must be a multiple of 90 degrees.\"\n );\n }\n\n if (dontFlip) {\n rotateC = -rotateC;\n rotateD = -rotateD;\n }\n\n let offsetCanvasX, offsetCanvasY;\n let width, height;\n if (rotateA === 0) {\n offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;\n width = (viewBox[3] - viewBox[1]) * scale;\n height = (viewBox[2] - viewBox[0]) * scale;\n } else {\n offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;\n offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;\n width = (viewBox[2] - viewBox[0]) * scale;\n height = (viewBox[3] - viewBox[1]) * scale;\n }\n // creating transform for the following operations:\n // translate(-centerX, -centerY), rotate and flip vertically,\n // scale, and translate(offsetCanvasX, offsetCanvasY)\n this.transform = [\n rotateA * scale,\n rotateB * scale,\n rotateC * scale,\n rotateD * scale,\n offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,\n offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY,\n ];\n\n this.width = width;\n this.height = height;\n }\n\n /**\n * The original, un-scaled, viewport dimensions.\n * @type {Object}\n */\n get rawDims() {\n const dims = this.viewBox;\n\n return shadow(this, \"rawDims\", {\n pageWidth: dims[2] - dims[0],\n pageHeight: dims[3] - dims[1],\n pageX: dims[0],\n pageY: dims[1],\n });\n }\n\n /**\n * Clones viewport, with optional additional properties.\n * @param {PageViewportCloneParameters} [params]\n * @returns {PageViewport} Cloned viewport.\n */\n clone({\n scale = this.scale,\n rotation = this.rotation,\n offsetX = this.offsetX,\n offsetY = this.offsetY,\n dontFlip = false,\n } = {}) {\n return new PageViewport({\n viewBox: this.viewBox.slice(),\n userUnit: this.userUnit,\n scale,\n rotation,\n offsetX,\n offsetY,\n dontFlip,\n });\n }\n\n /**\n * Converts PDF point to the viewport coordinates. For examples, useful for\n * converting PDF location into canvas pixel coordinates.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the viewport coordinate space.\n * @see {@link convertToPdfPoint}\n * @see {@link convertToViewportRectangle}\n */\n convertToViewportPoint(x, y) {\n const p = [x, y];\n Util.applyTransform(p, this.transform);\n return p;\n }\n\n /**\n * Converts PDF rectangle to the viewport coordinates.\n * @param {Array} rect - The xMin, yMin, xMax and yMax coordinates.\n * @returns {Array} Array containing corresponding coordinates of the\n * rectangle in the viewport coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToViewportRectangle(rect) {\n const topLeft = [rect[0], rect[1]];\n Util.applyTransform(topLeft, this.transform);\n const bottomRight = [rect[2], rect[3]];\n Util.applyTransform(bottomRight, this.transform);\n return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];\n }\n\n /**\n * Converts viewport coordinates to the PDF location. For examples, useful\n * for converting canvas pixel location into PDF one.\n * @param {number} x - The x-coordinate.\n * @param {number} y - The y-coordinate.\n * @returns {Array} Array containing `x`- and `y`-coordinates of the\n * point in the PDF coordinate space.\n * @see {@link convertToViewportPoint}\n */\n convertToPdfPoint(x, y) {\n const p = [x, y];\n Util.applyInverseTransform(p, this.transform);\n return p;\n }\n}\n\nclass RenderingCancelledException extends BaseException {\n constructor(msg, extraDelay = 0) {\n super(msg, \"RenderingCancelledException\");\n this.extraDelay = extraDelay;\n }\n}\n\nfunction isDataScheme(url) {\n const ii = url.length;\n let i = 0;\n while (i < ii && url[i].trim() === \"\") {\n i++;\n }\n return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\nfunction isPdfFile(filename) {\n return typeof filename === \"string\" && /\\.pdf$/i.test(filename);\n}\n\n/**\n * Gets the filename from a given URL.\n * @param {string} url\n * @returns {string}\n */\nfunction getFilenameFromUrl(url) {\n [url] = url.split(/[#?]/, 1);\n return url.substring(url.lastIndexOf(\"/\") + 1);\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n * unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPdfFilenameFromUrl(url, defaultFilename = \"document.pdf\") {\n if (typeof url !== \"string\") {\n return defaultFilename;\n }\n if (isDataScheme(url)) {\n warn('getPdfFilenameFromUrl: ignore \"data:\"-URL for performance reasons.');\n return defaultFilename;\n }\n\n const getURL = urlString => {\n try {\n return new URL(urlString);\n } catch {\n try {\n return new URL(decodeURIComponent(urlString));\n } catch {\n try {\n // Attempt to parse the URL using the document's base URI.\n return new URL(urlString, \"https://foo.bar\");\n } catch {\n try {\n return new URL(decodeURIComponent(urlString), \"https://foo.bar\");\n } catch {\n return null;\n }\n }\n }\n }\n };\n\n const newURL = getURL(url);\n if (!newURL) {\n // If the URL is invalid, return the default filename.\n return defaultFilename;\n }\n\n const decode = name => {\n try {\n let decoded = decodeURIComponent(name);\n if (decoded.includes(\"/\")) {\n decoded = decoded.split(\"/\").at(-1);\n if (decoded.test(/^\\.pdf$/i)) {\n return decoded;\n }\n return name;\n }\n return decoded;\n } catch {\n return name;\n }\n };\n\n const pdfRegex = /\\.pdf$/i;\n const filename = newURL.pathname.split(\"/\").at(-1);\n if (pdfRegex.test(filename)) {\n return decode(filename);\n }\n\n if (newURL.searchParams.size > 0) {\n const values = Array.from(newURL.searchParams.values()).reverse();\n for (const value of values) {\n if (pdfRegex.test(value)) {\n // If any of the search parameters ends with \".pdf\", return it.\n return decode(value);\n }\n }\n const keys = Array.from(newURL.searchParams.keys()).reverse();\n for (const key of keys) {\n if (pdfRegex.test(key)) {\n // If any of the search parameter keys ends with \".pdf\", return it.\n return decode(key);\n }\n }\n }\n\n if (newURL.hash) {\n const reFilename = /[^/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n const hashFilename = reFilename.exec(newURL.hash);\n if (hashFilename) {\n return decode(hashFilename[0]);\n }\n }\n\n return defaultFilename;\n}\n\nclass StatTimer {\n started = Object.create(null);\n\n times = [];\n\n time(name) {\n if (name in this.started) {\n warn(`Timer is already running for ${name}`);\n }\n this.started[name] = Date.now();\n }\n\n timeEnd(name) {\n if (!(name in this.started)) {\n warn(`Timer has not been started for ${name}`);\n }\n this.times.push({\n name,\n start: this.started[name],\n end: Date.now(),\n });\n // Remove timer from started so it can be called again.\n delete this.started[name];\n }\n\n toString() {\n // Find the longest name for padding purposes.\n const outBuf = [];\n let longest = 0;\n for (const { name } of this.times) {\n longest = Math.max(name.length, longest);\n }\n for (const { name, start, end } of this.times) {\n outBuf.push(`${name.padEnd(longest)} ${end - start}ms\\n`);\n }\n return outBuf.join(\"\");\n }\n}\n\nfunction isValidFetchUrl(url, baseUrl) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: isValidFetchUrl\");\n }\n const res = baseUrl ? URL.parse(url, baseUrl) : URL.parse(url);\n // The Fetch API only supports the http/https protocols, and not file/ftp.\n return res?.protocol === \"http:\" || res?.protocol === \"https:\";\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenu(e) {\n e.preventDefault();\n}\n\nfunction stopEvent(e) {\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Deprecated API function -- display regardless of the `verbosity` setting.\nfunction deprecated(details) {\n // eslint-disable-next-line no-console\n console.log(\"Deprecated API usage: \" + details);\n}\n\nclass PDFDateString {\n static #regex;\n\n /**\n * Convert a PDF date string to a JavaScript `Date` object.\n *\n * The PDF date string format is described in section 7.9.4 of the official\n * PDF 32000-1:2008 specification. However, in the PDF 1.7 reference (sixth\n * edition) Adobe describes the same format including a trailing apostrophe.\n * This syntax in incorrect, but Adobe Acrobat creates PDF files that contain\n * them. We ignore all apostrophes as they are not necessary for date parsing.\n *\n * Moreover, Adobe Acrobat doesn't handle changing the date to universal time\n * and doesn't use the user's time zone (effectively ignoring the HH' and mm'\n * parts of the date string).\n *\n * @param {string} input\n * @returns {Date|null}\n */\n static toDateObject(input) {\n if (input instanceof Date) {\n return input;\n }\n if (!input || typeof input !== \"string\") {\n return null;\n }\n\n // Lazily initialize the regular expression.\n this.#regex ||= new RegExp(\n \"^D:\" + // Prefix (required)\n \"(\\\\d{4})\" + // Year (required)\n \"(\\\\d{2})?\" + // Month (optional)\n \"(\\\\d{2})?\" + // Day (optional)\n \"(\\\\d{2})?\" + // Hour (optional)\n \"(\\\\d{2})?\" + // Minute (optional)\n \"(\\\\d{2})?\" + // Second (optional)\n \"([Z|+|-])?\" + // Universal time relation (optional)\n \"(\\\\d{2})?\" + // Offset hour (optional)\n \"'?\" + // Splitting apostrophe (optional)\n \"(\\\\d{2})?\" + // Offset minute (optional)\n \"'?\" // Trailing apostrophe (optional)\n );\n\n // Optional fields that don't satisfy the requirements from the regular\n // expression (such as incorrect digit counts or numbers that are out of\n // range) will fall back the defaults from the specification.\n const matches = this.#regex.exec(input);\n if (!matches) {\n return null;\n }\n\n // JavaScript's `Date` object expects the month to be between 0 and 11\n // instead of 1 and 12, so we have to correct for that.\n const year = parseInt(matches[1], 10);\n let month = parseInt(matches[2], 10);\n month = month >= 1 && month <= 12 ? month - 1 : 0;\n let day = parseInt(matches[3], 10);\n day = day >= 1 && day <= 31 ? day : 1;\n let hour = parseInt(matches[4], 10);\n hour = hour >= 0 && hour <= 23 ? hour : 0;\n let minute = parseInt(matches[5], 10);\n minute = minute >= 0 && minute <= 59 ? minute : 0;\n let second = parseInt(matches[6], 10);\n second = second >= 0 && second <= 59 ? second : 0;\n const universalTimeRelation = matches[7] || \"Z\";\n let offsetHour = parseInt(matches[8], 10);\n offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;\n let offsetMinute = parseInt(matches[9], 10) || 0;\n offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;\n\n // Universal time relation 'Z' means that the local time is equal to the\n // universal time, whereas the relations '+'/'-' indicate that the local\n // time is later respectively earlier than the universal time. Every date\n // is normalized to universal time.\n if (universalTimeRelation === \"-\") {\n hour += offsetHour;\n minute += offsetMinute;\n } else if (universalTimeRelation === \"+\") {\n hour -= offsetHour;\n minute -= offsetMinute;\n }\n\n return new Date(Date.UTC(year, month, day, hour, minute, second));\n }\n}\n\n/**\n * NOTE: This is (mostly) intended to support printing of XFA forms.\n */\nfunction getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) {\n const { width, height } = xfaPage.attributes.style;\n const viewBox = [0, 0, parseInt(width), parseInt(height)];\n\n return new PageViewport({\n viewBox,\n userUnit: 1,\n scale,\n rotation,\n });\n}\n\nfunction getRGB(color) {\n if (color.startsWith(\"#\")) {\n const colorRGB = parseInt(color.slice(1), 16);\n return [\n (colorRGB & 0xff0000) >> 16,\n (colorRGB & 0x00ff00) >> 8,\n colorRGB & 0x0000ff,\n ];\n }\n\n if (color.startsWith(\"rgb(\")) {\n // getComputedStyle(...).color returns a `rgb(R, G, B)` color.\n return color\n .slice(/* \"rgb(\".length */ 4, -1) // Strip out \"rgb(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x));\n }\n\n if (color.startsWith(\"rgba(\")) {\n return color\n .slice(/* \"rgba(\".length */ 5, -1) // Strip out \"rgba(\" and \")\".\n .split(\",\")\n .map(x => parseInt(x))\n .slice(0, 3);\n }\n\n warn(`Not a valid color format: \"${color}\"`);\n return [0, 0, 0];\n}\n\nfunction getColorValues(colors) {\n const span = document.createElement(\"span\");\n span.style.visibility = \"hidden\";\n // NOTE: The following does *not* affect `forced-colors: active` mode.\n span.style.colorScheme = \"only light\";\n document.body.append(span);\n for (const name of colors.keys()) {\n span.style.color = name;\n const computedColor = window.getComputedStyle(span).color;\n colors.set(name, getRGB(computedColor));\n }\n span.remove();\n}\n\nfunction getCurrentTransform(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform();\n return [a, b, c, d, e, f];\n}\n\nfunction getCurrentTransformInverse(ctx) {\n const { a, b, c, d, e, f } = ctx.getTransform().invertSelf();\n return [a, b, c, d, e, f];\n}\n\n/**\n * @param {HTMLDivElement} div\n * @param {PageViewport} viewport\n * @param {boolean} mustFlip\n * @param {boolean} mustRotate\n */\nfunction setLayerDimensions(\n div,\n viewport,\n mustFlip = false,\n mustRotate = true\n) {\n if (viewport instanceof PageViewport) {\n const { pageWidth, pageHeight } = viewport.rawDims;\n const { style } = div;\n const useRound = FeatureTest.isCSSRoundSupported;\n\n const w = `var(--total-scale-factor) * ${pageWidth}px`,\n h = `var(--total-scale-factor) * ${pageHeight}px`;\n const widthStr = useRound\n ? `round(down, ${w}, var(--scale-round-x))`\n : `calc(${w})`,\n heightStr = useRound\n ? `round(down, ${h}, var(--scale-round-y))`\n : `calc(${h})`;\n\n if (!mustFlip || viewport.rotation % 180 === 0) {\n style.width = widthStr;\n style.height = heightStr;\n } else {\n style.width = heightStr;\n style.height = widthStr;\n }\n }\n\n if (mustRotate) {\n div.setAttribute(\"data-main-rotation\", viewport.rotation);\n }\n}\n\n/**\n * Scale factors for the canvas, necessary with HiDPI displays.\n */\nclass OutputScale {\n constructor() {\n const { pixelRatio } = OutputScale;\n\n /**\n * @type {number} Horizontal scale.\n */\n this.sx = pixelRatio;\n\n /**\n * @type {number} Vertical scale.\n */\n this.sy = pixelRatio;\n }\n\n /**\n * @type {boolean} Returns `true` when scaling is required, `false` otherwise.\n */\n get scaled() {\n return this.sx !== 1 || this.sy !== 1;\n }\n\n /**\n * @type {boolean} Returns `true` when scaling is symmetric,\n * `false` otherwise.\n */\n get symmetric() {\n return this.sx === this.sy;\n }\n\n /**\n * @returns {boolean} Returns `true` if scaling was limited,\n * `false` otherwise.\n */\n limitCanvas(width, height, maxPixels, maxDim, capAreaFactor = -1) {\n let maxAreaScale = Infinity,\n maxWidthScale = Infinity,\n maxHeightScale = Infinity;\n\n maxPixels = OutputScale.capPixels(maxPixels, capAreaFactor);\n if (maxPixels > 0) {\n maxAreaScale = Math.sqrt(maxPixels / (width * height));\n }\n if (maxDim !== -1) {\n maxWidthScale = maxDim / width;\n maxHeightScale = maxDim / height;\n }\n const maxScale = Math.min(maxAreaScale, maxWidthScale, maxHeightScale);\n\n if (this.sx > maxScale || this.sy > maxScale) {\n this.sx = maxScale;\n this.sy = maxScale;\n return true;\n }\n return false;\n }\n\n static get pixelRatio() {\n return globalThis.devicePixelRatio || 1;\n }\n\n static capPixels(maxPixels, capAreaFactor) {\n if (capAreaFactor >= 0) {\n const winPixels = Math.ceil(\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")\n ? window.innerWidth * window.innerHeight\n : window.screen.availWidth * window.screen.availHeight) *\n this.pixelRatio ** 2 *\n (1 + capAreaFactor / 100)\n );\n return maxPixels > 0 ? Math.min(maxPixels, winPixels) : winPixels;\n }\n return maxPixels;\n }\n}\n\n// See https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types\n// to know which types are supported by the browser.\nconst SupportedImageMimeTypes = [\n \"image/apng\",\n \"image/avif\",\n \"image/bmp\",\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/svg+xml\",\n \"image/webp\",\n \"image/x-icon\",\n];\n\nclass ColorScheme {\n static get isDarkMode() {\n return shadow(\n this,\n \"isDarkMode\",\n !!window?.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n );\n }\n}\n\nclass CSSConstants {\n static get commentForegroundColor() {\n const element = document.createElement(\"span\");\n element.classList.add(\"comment\", \"sidebar\");\n const { style } = element;\n style.width = style.height = \"0\";\n style.display = \"none\";\n style.color = \"var(--comment-fg-color)\";\n document.body.append(element);\n const { color } = window.getComputedStyle(element);\n element.remove();\n return shadow(this, \"commentForegroundColor\", getRGB(color));\n }\n}\n\nfunction applyOpacity(r, g, b, opacity) {\n opacity = Math.min(Math.max(opacity ?? 1, 0), 1);\n const white = 255 * (1 - opacity);\n r = Math.round(r * opacity + white);\n g = Math.round(g * opacity + white);\n b = Math.round(b * opacity + white);\n return [r, g, b];\n}\n\nfunction RGBToHSL(rgb, output) {\n const r = rgb[0] / 255;\n const g = rgb[1] / 255;\n const b = rgb[2] / 255;\n\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n\n if (max === min) {\n // achromatic\n output[0] = output[1] = 0; // hue and saturation are 0\n } else {\n const d = max - min;\n output[1] = l < 0.5 ? d / (max + min) : d / (2 - max - min);\n // hue\n switch (max) {\n case r:\n output[0] = ((g - b) / d + (g < b ? 6 : 0)) * 60;\n break;\n case g:\n output[0] = ((b - r) / d + 2) * 60;\n break;\n case b:\n output[0] = ((r - g) / d + 4) * 60;\n break;\n }\n }\n output[2] = l;\n}\n\nfunction HSLToRGB(hsl, output) {\n const h = hsl[0];\n const s = hsl[1];\n const l = hsl[2];\n const c = (1 - Math.abs(2 * l - 1)) * s; // chroma\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n\n switch (Math.floor(h / 60)) {\n case 0:\n output[0] = c + m;\n output[1] = x + m;\n output[2] = m;\n break;\n case 1:\n output[0] = x + m;\n output[1] = c + m;\n output[2] = m;\n break;\n case 2:\n output[0] = m;\n output[1] = c + m;\n output[2] = x + m;\n break;\n case 3:\n output[0] = m;\n output[1] = x + m;\n output[2] = c + m;\n break;\n case 4:\n output[0] = x + m;\n output[1] = m;\n output[2] = c + m;\n break;\n case 5:\n case 6:\n output[0] = c + m;\n output[1] = m;\n output[2] = x + m;\n break;\n }\n}\n\nfunction computeLuminance(x) {\n return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n}\n\nfunction contrastRatio(hsl1, hsl2, output) {\n HSLToRGB(hsl1, output);\n output.map(computeLuminance);\n const lum1 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n HSLToRGB(hsl2, output);\n output.map(computeLuminance);\n const lum2 = 0.2126 * output[0] + 0.7152 * output[1] + 0.0722 * output[2];\n return lum1 > lum2\n ? (lum1 + 0.05) / (lum2 + 0.05)\n : (lum2 + 0.05) / (lum1 + 0.05);\n}\n\n// Cache for the findContrastColor function, to improve performance.\nconst contrastCache = new Map();\n\n/**\n * Find a color that has sufficient contrast against a fixed color.\n * The luminance (in HSL color space) of the base color is adjusted\n * until the contrast ratio between the base color and the fixed color\n * is at least the minimum contrast ratio required by WCAG 2.1.\n * @param {Array} baseColor\n * @param {Array} fixedColor\n * @returns {string}\n */\nfunction findContrastColor(baseColor, fixedColor) {\n const key =\n baseColor[0] +\n baseColor[1] * 0x100 +\n baseColor[2] * 0x10000 +\n fixedColor[0] * 0x1000000 +\n fixedColor[1] * 0x100000000 +\n fixedColor[2] * 0x10000000000;\n let cachedValue = contrastCache.get(key);\n if (cachedValue) {\n return cachedValue;\n }\n const array = new Float32Array(9);\n const output = array.subarray(0, 3);\n const baseHSL = array.subarray(3, 6);\n RGBToHSL(baseColor, baseHSL);\n const fixedHSL = array.subarray(6, 9);\n RGBToHSL(fixedColor, fixedHSL);\n const isFixedColorDark = fixedHSL[2] < 0.5;\n\n // Use the contrast ratio requirements from WCAG 2.1.\n // https://www.w3.org/TR/WCAG21/#contrast-minimum\n // https://www.w3.org/TR/WCAG21/#contrast-enhanced\n const minContrast = isFixedColorDark ? 12 : 4.5;\n\n baseHSL[2] = isFixedColorDark\n ? Math.sqrt(baseHSL[2])\n : 1 - Math.sqrt(1 - baseHSL[2]);\n\n if (contrastRatio(baseHSL, fixedHSL, output) < minContrast) {\n let start, end;\n if (isFixedColorDark) {\n start = baseHSL[2];\n end = 1;\n } else {\n start = 0;\n end = baseHSL[2];\n }\n const PRECISION = 0.005;\n while (end - start > PRECISION) {\n const mid = (baseHSL[2] = (start + end) / 2);\n if (\n isFixedColorDark ===\n contrastRatio(baseHSL, fixedHSL, output) < minContrast\n ) {\n start = mid;\n } else {\n end = mid;\n }\n }\n baseHSL[2] = isFixedColorDark ? end : start;\n }\n\n HSLToRGB(baseHSL, output);\n cachedValue = Util.makeHexColor(\n Math.round(output[0] * 255),\n Math.round(output[1] * 255),\n Math.round(output[2] * 255)\n );\n contrastCache.set(key, cachedValue);\n return cachedValue;\n}\n\nfunction renderRichText({ html, dir, className }, container) {\n const fragment = document.createDocumentFragment();\n if (typeof html === \"string\") {\n const p = document.createElement(\"p\");\n p.dir = dir || \"auto\";\n const lines = html.split(/(?:\\r\\n?|\\n)/);\n for (let i = 0, ii = lines.length; i < ii; ++i) {\n const line = lines[i];\n p.append(document.createTextNode(line));\n if (i < ii - 1) {\n p.append(document.createElement(\"br\"));\n }\n }\n fragment.append(p);\n } else {\n XfaLayer.render({\n xfaHtml: html,\n div: fragment,\n intent: \"richText\",\n });\n }\n fragment.firstChild.classList.add(\"richText\", className);\n container.append(fragment);\n}\n\nexport {\n applyOpacity,\n ColorScheme,\n CSSConstants,\n deprecated,\n fetchData,\n findContrastColor,\n getColorValues,\n getCurrentTransform,\n getCurrentTransformInverse,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getRGB,\n getXfaPageViewport,\n isDataScheme,\n isPdfFile,\n isValidFetchUrl,\n noContextMenu,\n OutputScale,\n PageViewport,\n PDFDateString,\n PixelsPerInch,\n RenderingCancelledException,\n renderRichText,\n setLayerDimensions,\n StatTimer,\n stopEvent,\n SupportedImageMimeTypes,\n SVG_NS,\n};\n","/* Copyright 2023 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\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass EditorToolbar {\n #toolbar = null;\n\n #colorPicker = null;\n\n #editor;\n\n #buttons = null;\n\n #altText = null;\n\n #comment = null;\n\n #commentButtonDivider = null;\n\n #signatureDescriptionButton = null;\n\n static #l10nRemove = null;\n\n constructor(editor) {\n this.#editor = editor;\n\n EditorToolbar.#l10nRemove ||= Object.freeze({\n freetext: \"pdfjs-editor-remove-freetext-button\",\n highlight: \"pdfjs-editor-remove-highlight-button\",\n ink: \"pdfjs-editor-remove-ink-button\",\n stamp: \"pdfjs-editor-remove-stamp-button\",\n signature: \"pdfjs-editor-remove-signature-button\",\n });\n }\n\n render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.classList.add(\"editToolbar\", \"hidden\");\n editToolbar.setAttribute(\"role\", \"toolbar\");\n\n const signal = this.#editor._uiManager._signal;\n if (signal instanceof AbortSignal && !signal.aborted) {\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, { signal });\n editToolbar.addEventListener(\"pointerdown\", EditorToolbar.#pointerDown, {\n signal,\n });\n }\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n const position = this.#editor.toolbarPosition;\n if (position) {\n const { style } = editToolbar;\n const x =\n this.#editor._uiManager.direction === \"ltr\"\n ? 1 - position[0]\n : position[0];\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${\n 100 * position[1]\n }% + var(--editor-toolbar-vert-offset))`;\n }\n\n return editToolbar;\n }\n\n get div() {\n return this.#toolbar;\n }\n\n static #pointerDown(e) {\n e.stopPropagation();\n }\n\n #focusIn(e) {\n this.#editor._focusEventsAllowed = false;\n stopEvent(e);\n }\n\n #focusOut(e) {\n this.#editor._focusEventsAllowed = true;\n stopEvent(e);\n }\n\n #addListenersToElement(element) {\n // If we're clicking on a button with the keyboard or with\n // the mouse, we don't want to trigger any focus events on\n // the editor.\n const signal = this.#editor._uiManager._signal;\n if (!(signal instanceof AbortSignal) || signal.aborted) {\n return false;\n }\n element.addEventListener(\"focusin\", this.#focusIn.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"focusout\", this.#focusOut.bind(this), {\n capture: true,\n signal,\n });\n element.addEventListener(\"contextmenu\", noContextMenu, { signal });\n return true;\n }\n\n hide() {\n this.#toolbar.classList.add(\"hidden\");\n this.#colorPicker?.hideDropdown();\n }\n\n show() {\n this.#toolbar.classList.remove(\"hidden\");\n this.#altText?.shown();\n this.#comment?.shown();\n }\n\n addDeleteButton() {\n const { editorType, _uiManager } = this.#editor;\n\n const button = document.createElement(\"button\");\n button.classList.add(\"basic\", \"deleteButton\");\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", EditorToolbar.#l10nRemove[editorType]);\n if (this.#addListenersToElement(button)) {\n button.addEventListener(\n \"click\",\n e => {\n _uiManager.delete();\n },\n { signal: _uiManager._signal }\n );\n }\n this.#buttons.append(button);\n }\n\n get #divider() {\n const divider = document.createElement(\"div\");\n divider.className = \"divider\";\n return divider;\n }\n\n async addAltText(altText) {\n const button = await altText.render();\n this.#addListenersToElement(button);\n this.#buttons.append(button, this.#divider);\n this.#altText = altText;\n }\n\n addComment(comment, beforeElement = null) {\n if (this.#comment) {\n return;\n }\n const button = comment.renderForToolbar();\n if (!button) {\n return;\n }\n this.#addListenersToElement(button);\n const divider = (this.#commentButtonDivider = this.#divider);\n if (!beforeElement) {\n this.#buttons.append(button, divider);\n } else {\n this.#buttons.insertBefore(button, beforeElement);\n this.#buttons.insertBefore(divider, beforeElement);\n }\n this.#comment = comment;\n comment.toolbar = this;\n }\n\n addColorPicker(colorPicker) {\n if (this.#colorPicker) {\n return;\n }\n this.#colorPicker = colorPicker;\n const button = colorPicker.renderButton();\n this.#addListenersToElement(button);\n this.#buttons.append(button, this.#divider);\n }\n\n async addEditSignatureButton(signatureManager) {\n const button = (this.#signatureDescriptionButton =\n await signatureManager.renderEditButton(this.#editor));\n this.#addListenersToElement(button);\n this.#buttons.append(button, this.#divider);\n }\n\n removeButton(name) {\n switch (name) {\n case \"comment\":\n this.#comment?.removeToolbarCommentButton();\n this.#comment = null;\n this.#commentButtonDivider?.remove();\n this.#commentButtonDivider = null;\n break;\n }\n }\n\n async addButton(name, tool) {\n switch (name) {\n case \"colorPicker\":\n this.addColorPicker(tool);\n break;\n case \"altText\":\n await this.addAltText(tool);\n break;\n case \"editSignature\":\n await this.addEditSignatureButton(tool);\n break;\n case \"delete\":\n this.addDeleteButton();\n break;\n case \"comment\":\n this.addComment(tool);\n break;\n }\n }\n\n async addButtonBefore(name, tool, beforeSelector) {\n const beforeElement = this.#buttons.querySelector(beforeSelector);\n if (!beforeElement) {\n return;\n }\n if (name === \"comment\") {\n this.addComment(tool, beforeElement);\n }\n }\n\n updateEditSignatureButton(description) {\n if (this.#signatureDescriptionButton) {\n this.#signatureDescriptionButton.title = description;\n }\n }\n\n remove() {\n this.#toolbar.remove();\n this.#colorPicker?.destroy();\n this.#colorPicker = null;\n }\n}\n\nclass FloatingToolbar {\n #buttons = null;\n\n #toolbar = null;\n\n #uiManager;\n\n constructor(uiManager) {\n this.#uiManager = uiManager;\n }\n\n #render() {\n const editToolbar = (this.#toolbar = document.createElement(\"div\"));\n editToolbar.className = \"editToolbar\";\n editToolbar.setAttribute(\"role\", \"toolbar\");\n\n const signal = this.#uiManager._signal;\n if (signal instanceof AbortSignal && !signal.aborted) {\n editToolbar.addEventListener(\"contextmenu\", noContextMenu, {\n signal,\n });\n }\n\n const buttons = (this.#buttons = document.createElement(\"div\"));\n buttons.className = \"buttons\";\n editToolbar.append(buttons);\n\n if (this.#uiManager.hasCommentManager()) {\n this.#makeButton(\n \"commentButton\",\n `pdfjs-comment-floating-button`,\n \"pdfjs-comment-floating-button-label\",\n () => {\n this.#uiManager.commentSelection(\"floating_button\");\n }\n );\n }\n\n this.#makeButton(\n \"highlightButton\",\n `pdfjs-highlight-floating-button1`,\n \"pdfjs-highlight-floating-button-label\",\n () => {\n this.#uiManager.highlightSelection(\"floating_button\");\n }\n );\n\n return editToolbar;\n }\n\n #getLastPoint(boxes, isLTR) {\n let lastY = 0;\n let lastX = 0;\n for (const box of boxes) {\n const y = box.y + box.height;\n if (y < lastY) {\n continue;\n }\n const x = box.x + (isLTR ? box.width : 0);\n if (y > lastY) {\n lastX = x;\n lastY = y;\n continue;\n }\n if (isLTR) {\n if (x > lastX) {\n lastX = x;\n }\n } else if (x < lastX) {\n lastX = x;\n }\n }\n return [isLTR ? 1 - lastX : lastX, lastY];\n }\n\n show(parent, boxes, isLTR) {\n const [x, y] = this.#getLastPoint(boxes, isLTR);\n const { style } = (this.#toolbar ||= this.#render());\n parent.append(this.#toolbar);\n style.insetInlineEnd = `${100 * x}%`;\n style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;\n }\n\n hide() {\n this.#toolbar.remove();\n }\n\n #makeButton(buttonClass, l10nId, labelL10nId, clickHandler) {\n const button = document.createElement(\"button\");\n button.classList.add(\"basic\", buttonClass);\n button.tabIndex = 0;\n button.setAttribute(\"data-l10n-id\", l10nId);\n const span = document.createElement(\"span\");\n button.append(span);\n span.className = \"visuallyHidden\";\n span.setAttribute(\"data-l10n-id\", labelL10nId);\n const signal = this.#uiManager._signal;\n if (signal instanceof AbortSignal && !signal.aborted) {\n button.addEventListener(\"contextmenu\", noContextMenu, { signal });\n button.addEventListener(\"click\", clickHandler, { signal });\n }\n this.#buttons.append(button);\n }\n}\n\nexport { EditorToolbar, FloatingToolbar };\n","/* Copyright 2022 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/** @typedef {import(\"./editor.js\").AnnotationEditor} AnnotationEditor */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorParamsType,\n AnnotationEditorPrefix,\n AnnotationEditorType,\n FeatureTest,\n getUuid,\n shadow,\n Util,\n warn,\n} from \"../../shared/util.js\";\nimport {\n fetchData,\n getColorValues,\n getRGB,\n PixelsPerInch,\n stopEvent,\n} from \"../display_utils.js\";\nimport { FloatingToolbar } from \"./toolbar.js\";\n\nfunction bindEvents(obj, element, names) {\n for (const name of names) {\n element.addEventListener(name, obj[name].bind(obj));\n }\n}\n\n/**\n * Class to create some unique ids for the different editors.\n */\nclass IdManager {\n #id = 0;\n\n constructor() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => (this.#id = 0),\n });\n }\n }\n\n /**\n * Get a unique id.\n * @returns {string}\n */\n get id() {\n return `${AnnotationEditorPrefix}${this.#id++}`;\n }\n}\n\n/**\n * Class to manage the images used by the editors.\n * The main idea is to try to minimize the memory used by the images.\n * The images are cached and reused when possible\n * We use a refCounter to know when an image is not used anymore but we need to\n * be able to restore an image after a remove+undo, so we keep a file reference\n * or an url one.\n */\nclass ImageManager {\n #baseId = getUuid();\n\n #id = 0;\n\n #cache = null;\n\n static get _isSVGFittingCanvas() {\n // By default, Firefox doesn't rescale without preserving the aspect ratio\n // when drawing an SVG image on a canvas, see https://bugzilla.mozilla.org/1547776.\n // The \"workaround\" is to append \"svgView(preserveAspectRatio(none))\" to the\n // url, but according to comment #15, it seems that it leads to unexpected\n // behavior in Safari.\n const svg = `data:image/svg+xml;charset=UTF-8,`;\n const canvas = new OffscreenCanvas(1, 3);\n const ctx = canvas.getContext(\"2d\", { willReadFrequently: true });\n const image = new Image();\n image.src = svg;\n const promise = image.decode().then(() => {\n ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);\n return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;\n });\n\n return shadow(this, \"_isSVGFittingCanvas\", promise);\n }\n\n async #get(key, rawData) {\n this.#cache ||= new Map();\n let data = this.#cache.get(key);\n if (data === null) {\n // We already tried to load the image but it failed.\n return null;\n }\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n try {\n data ||= {\n bitmap: null,\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 0,\n isSvg: false,\n };\n let image;\n if (typeof rawData === \"string\") {\n data.url = rawData;\n image = await fetchData(rawData, \"blob\");\n } else if (rawData instanceof File) {\n image = data.file = rawData;\n } else if (rawData instanceof Blob) {\n image = rawData;\n }\n\n if (image.type === \"image/svg+xml\") {\n // Unfortunately, createImageBitmap doesn't work with SVG images.\n // (see https://bugzilla.mozilla.org/1841972).\n const mustRemoveAspectRatioPromise = ImageManager._isSVGFittingCanvas;\n const fileReader = new FileReader();\n const imageElement = new Image();\n const imagePromise = new Promise((resolve, reject) => {\n imageElement.onload = () => {\n data.bitmap = imageElement;\n data.isSvg = true;\n resolve();\n };\n fileReader.onload = async () => {\n const url = (data.svgUrl = fileReader.result);\n // We need to set the preserveAspectRatio to none in order to let\n // the image fits the canvas when resizing.\n imageElement.src = (await mustRemoveAspectRatioPromise)\n ? `${url}#svgView(preserveAspectRatio(none))`\n : url;\n };\n imageElement.onerror = fileReader.onerror = reject;\n });\n fileReader.readAsDataURL(image);\n await imagePromise;\n } else {\n data.bitmap = await createImageBitmap(image);\n }\n data.refCounter = 1;\n } catch (e) {\n warn(e);\n data = null;\n }\n this.#cache.set(key, data);\n if (data) {\n this.#cache.set(data.id, data);\n }\n return data;\n }\n\n async getFromFile(file) {\n const { lastModified, name, size, type } = file;\n return this.#get(`${lastModified}_${name}_${size}_${type}`, file);\n }\n\n async getFromUrl(url) {\n return this.#get(url, url);\n }\n\n async getFromBlob(id, blobPromise) {\n const blob = await blobPromise;\n return this.#get(id, blob);\n }\n\n async getFromId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return null;\n }\n if (data.bitmap) {\n data.refCounter += 1;\n return data;\n }\n\n if (data.file) {\n return this.getFromFile(data.file);\n }\n if (data.blobPromise) {\n const { blobPromise } = data;\n delete data.blobPromise;\n return this.getFromBlob(data.id, blobPromise);\n }\n return this.getFromUrl(data.url);\n }\n\n getFromCanvas(id, canvas) {\n this.#cache ||= new Map();\n let data = this.#cache.get(id);\n if (data?.bitmap) {\n data.refCounter += 1;\n return data;\n }\n const offscreen = new OffscreenCanvas(canvas.width, canvas.height);\n const ctx = offscreen.getContext(\"2d\");\n ctx.drawImage(canvas, 0, 0);\n data = {\n bitmap: offscreen.transferToImageBitmap(),\n id: `image_${this.#baseId}_${this.#id++}`,\n refCounter: 1,\n isSvg: false,\n };\n this.#cache.set(id, data);\n this.#cache.set(data.id, data);\n return data;\n }\n\n getSvgUrl(id) {\n const data = this.#cache.get(id);\n if (!data?.isSvg) {\n return null;\n }\n return data.svgUrl;\n }\n\n deleteId(id) {\n this.#cache ||= new Map();\n const data = this.#cache.get(id);\n if (!data) {\n return;\n }\n data.refCounter -= 1;\n if (data.refCounter !== 0) {\n return;\n }\n const { bitmap } = data;\n if (!data.url && !data.file) {\n // The image has no way to be restored (ctrl+z) so we must fix that.\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext(\"bitmaprenderer\");\n ctx.transferFromImageBitmap(bitmap);\n data.blobPromise = canvas.convertToBlob();\n }\n\n bitmap.close?.();\n data.bitmap = null;\n }\n\n // We can use the id only if it belongs this manager.\n // We must take care of having the right manager because we can copy/paste\n // some images from other documents, hence it'd be a pity to use an id from an\n // other manager.\n isValidId(id) {\n return id.startsWith(`image_${this.#baseId}_`);\n }\n}\n\n/**\n * Class to handle undo/redo.\n * Commands are just saved in a buffer.\n * If we hit some memory issues we could likely use a circular buffer.\n * It has to be used as a singleton.\n */\nclass CommandManager {\n #commands = [];\n\n #locked = false;\n\n #maxSize;\n\n #position = -1;\n\n constructor(maxSize = 128) {\n this.#maxSize = maxSize;\n }\n\n /**\n * @typedef {Object} addOptions\n * @property {function} cmd\n * @property {function} undo\n * @property {function} [post]\n * @property {boolean} mustExec\n * @property {number} type\n * @property {boolean} overwriteIfSameType\n * @property {boolean} keepUndo\n */\n\n /**\n * Add a new couple of commands to be used in case of redo/undo.\n * @param {addOptions} options\n */\n add({\n cmd,\n undo,\n post,\n mustExec,\n type = NaN,\n overwriteIfSameType = false,\n keepUndo = false,\n }) {\n if (mustExec) {\n cmd();\n }\n\n if (this.#locked) {\n return;\n }\n\n const save = { cmd, undo, post, type };\n if (this.#position === -1) {\n if (this.#commands.length > 0) {\n // All the commands have been undone and then a new one is added\n // hence we clear the queue.\n this.#commands.length = 0;\n }\n this.#position = 0;\n this.#commands.push(save);\n return;\n }\n\n if (overwriteIfSameType && this.#commands[this.#position].type === type) {\n // For example when we change a color we don't want to\n // be able to undo all the steps, hence we only want to\n // keep the last undoable action in this sequence of actions.\n if (keepUndo) {\n save.undo = this.#commands[this.#position].undo;\n }\n this.#commands[this.#position] = save;\n return;\n }\n\n const next = this.#position + 1;\n if (next === this.#maxSize) {\n this.#commands.splice(0, 1);\n } else {\n this.#position = next;\n if (next < this.#commands.length) {\n this.#commands.splice(next);\n }\n }\n\n this.#commands.push(save);\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n if (this.#position === -1) {\n // Nothing to undo.\n return;\n }\n\n // Avoid to insert something during the undo execution.\n this.#locked = true;\n const { undo, post } = this.#commands[this.#position];\n undo();\n post?.();\n this.#locked = false;\n\n this.#position -= 1;\n }\n\n /**\n * Redo the last command.\n */\n redo() {\n if (this.#position < this.#commands.length - 1) {\n this.#position += 1;\n\n // Avoid to insert something during the redo execution.\n this.#locked = true;\n const { cmd, post } = this.#commands[this.#position];\n cmd();\n post?.();\n this.#locked = false;\n }\n }\n\n /**\n * Check if there is something to undo.\n * @returns {boolean}\n */\n hasSomethingToUndo() {\n return this.#position !== -1;\n }\n\n /**\n * Check if there is something to redo.\n * @returns {boolean}\n */\n hasSomethingToRedo() {\n return this.#position < this.#commands.length - 1;\n }\n\n cleanType(type) {\n if (this.#position === -1) {\n return;\n }\n for (let i = this.#position; i >= 0; i--) {\n if (this.#commands[i].type !== type) {\n this.#commands.splice(i + 1, this.#position - i);\n this.#position = i;\n return;\n }\n }\n this.#commands.length = 0;\n this.#position = -1;\n }\n\n destroy() {\n this.#commands = null;\n }\n}\n\n/**\n * Class to handle the different keyboards shortcuts we can have on mac or\n * non-mac OSes.\n */\nclass KeyboardManager {\n /**\n * Create a new keyboard manager class.\n * @param {Array} callbacks - an array containing an array of shortcuts\n * and a callback to call.\n * A shortcut is a string like `ctrl+c` or `mac+ctrl+c` for mac OS.\n */\n constructor(callbacks) {\n this.buffer = [];\n this.callbacks = new Map();\n this.allKeys = new Set();\n\n const { isMac } = FeatureTest.platform;\n for (const [keys, callback, options = {}] of callbacks) {\n for (const key of keys) {\n const isMacKey = key.startsWith(\"mac+\");\n if (isMac && isMacKey) {\n this.callbacks.set(key.slice(4), { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n } else if (!isMac && !isMacKey) {\n this.callbacks.set(key, { callback, options });\n this.allKeys.add(key.split(\"+\").at(-1));\n }\n }\n }\n }\n\n /**\n * Serialize an event into a string in order to match a\n * potential key for a callback.\n * @param {KeyboardEvent} event\n * @returns {string}\n */\n #serialize(event) {\n if (event.altKey) {\n this.buffer.push(\"alt\");\n }\n if (event.ctrlKey) {\n this.buffer.push(\"ctrl\");\n }\n if (event.metaKey) {\n this.buffer.push(\"meta\");\n }\n if (event.shiftKey) {\n this.buffer.push(\"shift\");\n }\n this.buffer.push(event.key);\n const str = this.buffer.join(\"+\");\n this.buffer.length = 0;\n\n return str;\n }\n\n /**\n * Execute a callback, if any, for a given keyboard event.\n * The self is used as `this` in the callback.\n * @param {Object} self\n * @param {KeyboardEvent} event\n * @returns\n */\n exec(self, event) {\n if (!this.allKeys.has(event.key)) {\n return;\n }\n const info = this.callbacks.get(this.#serialize(event));\n if (!info) {\n return;\n }\n const {\n callback,\n options: { bubbles = false, args = [], checker = null },\n } = info;\n\n if (checker && !checker(self, event)) {\n return;\n }\n callback.bind(self, ...args, event)();\n\n // For example, ctrl+s in a FreeText must be handled by the viewer, hence\n // the event must bubble.\n if (!bubbles) {\n stopEvent(event);\n }\n }\n}\n\nclass ColorManager {\n static _colorsMapping = new Map([\n [\"CanvasText\", [0, 0, 0]],\n [\"Canvas\", [255, 255, 255]],\n ]);\n\n get _colors() {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ) {\n return shadow(this, \"_colors\", ColorManager._colorsMapping);\n }\n\n const colors = new Map([\n [\"CanvasText\", null],\n [\"Canvas\", null],\n ]);\n getColorValues(colors);\n return shadow(this, \"_colors\", colors);\n }\n\n /**\n * In High Contrast Mode, the color on the screen is not always the\n * real color used in the pdf.\n * For example in some cases white can appear to be black but when saving\n * we want to have white.\n * @param {string} color\n * @returns {Array}\n */\n convert(color) {\n const rgb = getRGB(color);\n if (!window.matchMedia(\"(forced-colors: active)\").matches) {\n return rgb;\n }\n\n for (const [name, RGB] of this._colors) {\n if (RGB.every((x, i) => x === rgb[i])) {\n return ColorManager._colorsMapping.get(name);\n }\n }\n return rgb;\n }\n\n /**\n * An input element must have its color value as a hex string\n * and not as color name.\n * So this function converts a name into an hex string.\n * @param {string} name\n * @returns {string}\n */\n getHexCode(name) {\n const rgb = this._colors.get(name);\n if (!rgb) {\n return name;\n }\n return Util.makeHexColor(...rgb);\n }\n}\n\n/**\n * A pdf has several pages and each of them when it will rendered\n * will have an AnnotationEditorLayer which will contain the some\n * new Annotations associated to an editor in order to modify them.\n *\n * This class is used to manage all the different layers, editors and\n * some action like copy/paste, undo/redo, ...\n */\nclass AnnotationEditorUIManager {\n #abortController = new AbortController();\n\n #activeEditor = null;\n\n #allEditableAnnotations = null;\n\n #allEditors = new Map();\n\n #allLayers = new Map();\n\n #altTextManager = null;\n\n #annotationStorage = null;\n\n #changedExistingAnnotations = null;\n\n #commandManager = new CommandManager();\n\n #commentManager = null;\n\n #copyPasteAC = null;\n\n #currentDrawingSession = null;\n\n #currentPageIndex = 0;\n\n #deletedAnnotationsElementIds = new Set();\n\n #draggingEditors = null;\n\n #editorTypes = null;\n\n #editorsToRescale = new Set();\n\n _editorUndoBar = null;\n\n #enableHighlightFloatingButton = false;\n\n #enableUpdatedAddImage = false;\n\n #enableNewAltTextWhenAddingImage = false;\n\n #filterFactory = null;\n\n #focusMainContainerTimeoutId = null;\n\n #focusManagerAC = null;\n\n #highlightColors = null;\n\n #highlightWhenShiftUp = false;\n\n #floatingToolbar = null;\n\n #idManager = new IdManager();\n\n #isEnabled = false;\n\n #isPointerDown = false;\n\n #isWaiting = false;\n\n #keyboardManagerAC = null;\n\n #lastActiveElement = null;\n\n #mainHighlightColorPicker = null;\n\n #missingCanvases = null;\n\n #mlManager = null;\n\n #mode = AnnotationEditorType.NONE;\n\n #selectedEditors = new Set();\n\n #selectedTextNode = null;\n\n #signatureManager = null;\n\n #pageColors = null;\n\n #showAllStates = null;\n\n #pdfDocument = null;\n\n #previousStates = {\n isEditing: false,\n isEmpty: true,\n hasSomethingToUndo: false,\n hasSomethingToRedo: false,\n hasSelectedEditor: false,\n hasSelectedText: false,\n };\n\n #translation = [0, 0];\n\n #translationTimeoutId = null;\n\n #container = null;\n\n #viewer = null;\n\n #viewerAlert = null;\n\n #updateModeCapability = null;\n\n static TRANSLATE_SMALL = 1; // page units.\n\n static TRANSLATE_BIG = 10; // page units.\n\n static get _keyboardManager() {\n const proto = AnnotationEditorUIManager.prototype;\n\n /**\n * If the focused element is an input, we don't want to handle the arrow.\n * For example, sliders can be controlled with the arrow keys.\n */\n const arrowChecker = self =>\n self.#container.contains(document.activeElement) &&\n document.activeElement.tagName !== \"BUTTON\" &&\n self.hasSomethingToControl();\n\n const textInputChecker = (_self, { target: el }) => {\n if (el instanceof HTMLInputElement) {\n const { type } = el;\n return type !== \"text\" && type !== \"number\";\n }\n return true;\n };\n\n const small = this.TRANSLATE_SMALL;\n const big = this.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_keyboardManager\",\n new KeyboardManager([\n [\n [\"ctrl+a\", \"mac+meta+a\"],\n proto.selectAll,\n { checker: textInputChecker },\n ],\n [[\"ctrl+z\", \"mac+meta+z\"], proto.undo, { checker: textInputChecker }],\n [\n // On mac, depending of the OS version, the event.key is either \"z\" or\n // \"Z\" when the user presses \"meta+shift+z\".\n [\n \"ctrl+y\",\n \"ctrl+shift+z\",\n \"mac+meta+shift+z\",\n \"ctrl+shift+Z\",\n \"mac+meta+shift+Z\",\n ],\n proto.redo,\n { checker: textInputChecker },\n ],\n [\n [\n \"Backspace\",\n \"alt+Backspace\",\n \"ctrl+Backspace\",\n \"shift+Backspace\",\n \"mac+Backspace\",\n \"mac+alt+Backspace\",\n \"mac+ctrl+Backspace\",\n \"Delete\",\n \"ctrl+Delete\",\n \"shift+Delete\",\n \"mac+Delete\",\n ],\n proto.delete,\n { checker: textInputChecker },\n ],\n [\n [\"Enter\", \"mac+Enter\"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(el) &&\n !self.isEnterHandled,\n },\n ],\n [\n [\" \", \"mac+ \"],\n proto.addNewEditorFromKeyboard,\n {\n // Those shortcuts can be used in the toolbar for some other actions\n // like zooming, hence we need to check if the container has the\n // focus.\n checker: (self, { target: el }) =>\n !(el instanceof HTMLButtonElement) &&\n self.#container.contains(document.activeElement),\n },\n ],\n [[\"Escape\", \"mac+Escape\"], proto.unselectAll],\n [\n [\"ArrowLeft\", \"mac+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n proto.translateSelectedEditors,\n { args: [-big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowRight\", \"mac+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [small, 0], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n proto.translateSelectedEditors,\n { args: [big, 0], checker: arrowChecker },\n ],\n [\n [\"ArrowUp\", \"mac+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"],\n proto.translateSelectedEditors,\n { args: [0, -big], checker: arrowChecker },\n ],\n [\n [\"ArrowDown\", \"mac+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, small], checker: arrowChecker },\n ],\n [\n [\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"],\n proto.translateSelectedEditors,\n { args: [0, big], checker: arrowChecker },\n ],\n ])\n );\n }\n\n constructor(\n container,\n viewer,\n viewerAlert,\n altTextManager,\n commentManager,\n signatureManager,\n eventBus,\n pdfDocument,\n pageColors,\n highlightColors,\n enableHighlightFloatingButton,\n enableUpdatedAddImage,\n enableNewAltTextWhenAddingImage,\n mlManager,\n editorUndoBar,\n supportsPinchToZoom\n ) {\n const signal = (this._signal = this.#abortController.signal);\n this.#container = container;\n this.#viewer = viewer;\n this.#viewerAlert = viewerAlert;\n this.#altTextManager = altTextManager;\n this.#commentManager = commentManager;\n this.#signatureManager = signatureManager;\n this.#pdfDocument = pdfDocument;\n this._eventBus = eventBus;\n eventBus._on(\"editingaction\", this.onEditingAction.bind(this), { signal });\n eventBus._on(\"pagechanging\", this.onPageChanging.bind(this), { signal });\n eventBus._on(\"scalechanging\", this.onScaleChanging.bind(this), { signal });\n eventBus._on(\"rotationchanging\", this.onRotationChanging.bind(this), {\n signal,\n });\n eventBus._on(\"setpreference\", this.onSetPreference.bind(this), { signal });\n eventBus._on(\n \"switchannotationeditorparams\",\n evt => this.updateParams(evt.type, evt.value),\n { signal }\n );\n window.addEventListener(\n \"pointerdown\",\n () => {\n this.#isPointerDown = true;\n },\n { capture: true, signal }\n );\n window.addEventListener(\n \"pointerup\",\n () => {\n this.#isPointerDown = false;\n },\n { capture: true, signal }\n );\n this.#addSelectionListener();\n this.#addDragAndDropListeners();\n this.#addKeyboardManager();\n this.#annotationStorage = pdfDocument.annotationStorage;\n this.#filterFactory = pdfDocument.filterFactory;\n this.#pageColors = pageColors;\n this.#highlightColors = highlightColors || null;\n this.#enableHighlightFloatingButton = enableHighlightFloatingButton;\n this.#enableUpdatedAddImage = enableUpdatedAddImage;\n this.#enableNewAltTextWhenAddingImage = enableNewAltTextWhenAddingImage;\n this.#mlManager = mlManager || null;\n this.viewParameters = {\n realScale: PixelsPerInch.PDF_TO_CSS_UNITS,\n rotation: 0,\n };\n this.isShiftKeyDown = false;\n this._editorUndoBar = editorUndoBar || null;\n this._supportsPinchToZoom = supportsPinchToZoom !== false;\n commentManager?.setSidebarUiManager(this);\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n Object.defineProperty(this, \"reset\", {\n value: () => {\n this.selectAll();\n this.delete();\n this.#idManager.reset();\n },\n });\n }\n }\n\n destroy() {\n this.#updateModeCapability?.resolve();\n this.#updateModeCapability = null;\n\n this.#abortController?.abort();\n this.#abortController = null;\n this._signal = null;\n\n for (const layer of this.#allLayers.values()) {\n layer.destroy();\n }\n this.#allLayers.clear();\n this.#allEditors.clear();\n this.#editorsToRescale.clear();\n this.#missingCanvases?.clear();\n this.#activeEditor = null;\n this.#selectedEditors.clear();\n this.#commandManager.destroy();\n this.#altTextManager?.destroy();\n this.#commentManager?.destroy();\n this.#signatureManager?.destroy();\n this.#floatingToolbar?.hide();\n this.#floatingToolbar = null;\n this.#mainHighlightColorPicker?.destroy();\n this.#mainHighlightColorPicker = null;\n this.#allEditableAnnotations = null;\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n this.#focusMainContainerTimeoutId = null;\n }\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n this.#translationTimeoutId = null;\n }\n this._editorUndoBar?.destroy();\n this.#pdfDocument = null;\n }\n\n combinedSignal(ac) {\n return AbortSignal.any([this._signal, ac.signal]);\n }\n\n get mlManager() {\n return this.#mlManager;\n }\n\n get useNewAltTextFlow() {\n return this.#enableUpdatedAddImage;\n }\n\n get useNewAltTextWhenAddingImage() {\n return this.#enableNewAltTextWhenAddingImage;\n }\n\n get hcmFilter() {\n return shadow(\n this,\n \"hcmFilter\",\n this.#pageColors\n ? this.#filterFactory.addHCMFilter(\n this.#pageColors.foreground,\n this.#pageColors.background\n )\n : \"none\"\n );\n }\n\n get direction() {\n return shadow(\n this,\n \"direction\",\n getComputedStyle(this.#container).direction\n );\n }\n\n get _highlightColors() {\n return shadow(\n this,\n \"_highlightColors\",\n this.#highlightColors\n ? new Map(\n this.#highlightColors.split(\",\").map(pair => {\n pair = pair.split(\"=\").map(x => x.trim());\n pair[1] = pair[1].toUpperCase();\n return pair;\n })\n )\n : null\n );\n }\n\n get highlightColors() {\n const { _highlightColors } = this;\n if (!_highlightColors) {\n return shadow(this, \"highlightColors\", null);\n }\n const map = new Map();\n const hasHCM = !!this.#pageColors;\n for (const [name, color] of _highlightColors) {\n const isNameForHCM = name.endsWith(\"_HCM\");\n if (hasHCM && isNameForHCM) {\n map.set(name.replace(\"_HCM\", \"\"), color);\n continue;\n }\n if (!hasHCM && !isNameForHCM) {\n map.set(name, color);\n }\n }\n return shadow(this, \"highlightColors\", map);\n }\n\n get highlightColorNames() {\n return shadow(\n this,\n \"highlightColorNames\",\n this.highlightColors\n ? new Map(Array.from(this.highlightColors, e => e.reverse()))\n : null\n );\n }\n\n getNonHCMColor(color) {\n if (!this._highlightColors) {\n return color;\n }\n const colorName = this.highlightColorNames.get(color);\n return this._highlightColors.get(colorName) || color;\n }\n\n getNonHCMColorName(color) {\n return this.highlightColorNames.get(color) || color;\n }\n\n /**\n * Set the current drawing session.\n * @param {AnnotationEditorLayer} layer\n */\n setCurrentDrawingSession(layer) {\n if (layer) {\n this.unselectAll();\n this.disableUserSelect(true);\n } else {\n this.disableUserSelect(false);\n }\n this.#currentDrawingSession = layer;\n }\n\n setMainHighlightColorPicker(colorPicker) {\n this.#mainHighlightColorPicker = colorPicker;\n }\n\n editAltText(editor, firstTime = false) {\n this.#altTextManager?.editAltText(this, editor, firstTime);\n }\n\n hasCommentManager() {\n return !!this.#commentManager;\n }\n\n editComment(editor, posX, posY, options) {\n this.#commentManager?.showDialog(this, editor, posX, posY, options);\n }\n\n selectComment(pageIndex, uid) {\n const layer = this.#allLayers.get(pageIndex);\n const editor = layer?.getEditorByUID(uid);\n editor?.toggleComment(/* isSelected */ true, /* visibility */ true);\n }\n\n updateComment(editor) {\n this.#commentManager?.updateComment(editor.getData());\n }\n\n updatePopupColor(editor) {\n this.#commentManager?.updatePopupColor(editor);\n }\n\n removeComment(editor) {\n this.#commentManager?.removeComments([editor.uid]);\n }\n\n toggleComment(editor, isSelected, visibility = undefined) {\n this.#commentManager?.toggleCommentPopup(editor, isSelected, visibility);\n }\n\n makeCommentColor(color, opacity) {\n return (\n (color && this.#commentManager?.makeCommentColor(color, opacity)) || null\n );\n }\n\n getCommentDialogElement() {\n return this.#commentManager?.dialogElement || null;\n }\n\n async waitForEditorsRendered(pageNumber) {\n if (this.#allLayers.has(pageNumber - 1)) {\n return;\n }\n const { resolve, promise } = Promise.withResolvers();\n const onEditorsRendered = evt => {\n if (evt.pageNumber === pageNumber) {\n this._eventBus._off(\"editorsrendered\", onEditorsRendered);\n resolve();\n }\n };\n this._eventBus.on(\"editorsrendered\", onEditorsRendered);\n await promise;\n }\n\n getSignature(editor) {\n this.#signatureManager?.getSignature({ uiManager: this, editor });\n }\n\n get signatureManager() {\n return this.#signatureManager;\n }\n\n switchToMode(mode, callback) {\n // Switching to a mode can be asynchronous.\n this._eventBus.on(\"annotationeditormodechanged\", callback, {\n once: true,\n signal: this._signal,\n });\n this._eventBus.dispatch(\"showannotationeditorui\", {\n source: this,\n mode,\n });\n }\n\n setPreference(name, value) {\n this._eventBus.dispatch(\"setpreference\", {\n source: this,\n name,\n value,\n });\n }\n\n onSetPreference({ name, value }) {\n switch (name) {\n case \"enableNewAltTextWhenAddingImage\":\n this.#enableNewAltTextWhenAddingImage = value;\n break;\n }\n }\n\n onPageChanging({ pageNumber }) {\n this.#currentPageIndex = pageNumber - 1;\n }\n\n focusMainContainer() {\n this.#container.focus();\n }\n\n findParent(x, y) {\n for (const layer of this.#allLayers.values()) {\n const {\n x: layerX,\n y: layerY,\n width,\n height,\n } = layer.div.getBoundingClientRect();\n if (\n x >= layerX &&\n x <= layerX + width &&\n y >= layerY &&\n y <= layerY + height\n ) {\n return layer;\n }\n }\n return null;\n }\n\n disableUserSelect(value = false) {\n this.#viewer.classList.toggle(\"noUserSelect\", value);\n }\n\n addShouldRescale(editor) {\n this.#editorsToRescale.add(editor);\n }\n\n removeShouldRescale(editor) {\n this.#editorsToRescale.delete(editor);\n }\n\n onScaleChanging({ scale }) {\n this.commitOrRemove();\n this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;\n for (const editor of this.#editorsToRescale) {\n editor.onScaleChanging();\n }\n this.#currentDrawingSession?.onScaleChanging();\n }\n\n onRotationChanging({ pagesRotation }) {\n this.commitOrRemove();\n this.viewParameters.rotation = pagesRotation;\n }\n\n #getAnchorElementForSelection({ anchorNode }) {\n return anchorNode.nodeType === Node.TEXT_NODE\n ? anchorNode.parentElement\n : anchorNode;\n }\n\n #getLayerForTextLayer(textLayer) {\n const { currentLayer } = this;\n if (currentLayer.hasTextLayer(textLayer)) {\n return currentLayer;\n }\n for (const layer of this.#allLayers.values()) {\n if (layer.hasTextLayer(textLayer)) {\n return layer;\n }\n }\n return null;\n }\n\n highlightSelection(methodOfCreation = \"\", comment = false) {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = selection;\n const text = selection.toString();\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n selection.empty();\n\n const layer = this.#getLayerForTextLayer(textLayer);\n const isNoneMode = this.#mode === AnnotationEditorType.NONE;\n const callback = () => {\n const editor = layer?.createAndAddNewEditor({ x: 0, y: 0 }, false, {\n methodOfCreation,\n boxes,\n anchorNode,\n anchorOffset,\n focusNode,\n focusOffset,\n text,\n });\n if (isNoneMode) {\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n if (comment) {\n editor?.editComment();\n }\n };\n if (isNoneMode) {\n this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);\n return;\n }\n callback();\n }\n\n commentSelection(methodOfCreation = \"\") {\n this.highlightSelection(methodOfCreation, /* comment */ true);\n }\n\n #displayFloatingToolbar() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n return;\n }\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n const boxes = this.getSelectionBoxes(textLayer);\n if (!boxes) {\n return;\n }\n this.#floatingToolbar ||= new FloatingToolbar(this);\n this.#floatingToolbar.show(textLayer, boxes, this.direction === \"ltr\");\n }\n\n /**\n * Some annotations may have been modified in the annotation layer\n * (e.g. comments added or modified).\n * So this function retrieves the data from the storage and removes\n * them from the storage in order to be able to save them later.\n * @param {string} annotationId\n * @returns {Object|null} The data associated to the annotation or null.\n */\n getAndRemoveDataFromAnnotationStorage(annotationId) {\n if (!this.#annotationStorage) {\n return null;\n }\n const key = `${AnnotationEditorPrefix}${annotationId}`;\n const storedValue = this.#annotationStorage.getRawValue(key);\n if (storedValue) {\n this.#annotationStorage.remove(key);\n }\n return storedValue;\n }\n\n /**\n * Add an editor in the annotation storage.\n * @param {AnnotationEditor} editor\n */\n addToAnnotationStorage(editor) {\n if (\n !editor.isEmpty() &&\n this.#annotationStorage &&\n !this.#annotationStorage.has(editor.id)\n ) {\n this.#annotationStorage.setValue(editor.id, editor);\n }\n }\n\n a11yAlert(messageId, args = null) {\n const viewerAlert = this.#viewerAlert;\n if (!viewerAlert) {\n return;\n }\n viewerAlert.setAttribute(\"data-l10n-id\", messageId);\n if (args) {\n viewerAlert.setAttribute(\"data-l10n-args\", JSON.stringify(args));\n } else {\n viewerAlert.removeAttribute(\"data-l10n-args\");\n }\n }\n\n #selectionChange() {\n const selection = document.getSelection();\n if (!selection || selection.isCollapsed) {\n if (this.#selectedTextNode) {\n this.#floatingToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n const { anchorNode } = selection;\n if (anchorNode === this.#selectedTextNode) {\n return;\n }\n\n const anchorElement = this.#getAnchorElementForSelection(selection);\n const textLayer = anchorElement.closest(\".textLayer\");\n if (!textLayer) {\n if (this.#selectedTextNode) {\n this.#floatingToolbar?.hide();\n this.#selectedTextNode = null;\n this.#dispatchUpdateStates({\n hasSelectedText: false,\n });\n }\n return;\n }\n\n this.#floatingToolbar?.hide();\n this.#selectedTextNode = anchorNode;\n this.#dispatchUpdateStates({\n hasSelectedText: true,\n });\n\n if (\n this.#mode !== AnnotationEditorType.HIGHLIGHT &&\n this.#mode !== AnnotationEditorType.NONE\n ) {\n return;\n }\n\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.showAllEditors(\"highlight\", true, /* updateButton = */ true);\n }\n\n this.#highlightWhenShiftUp = this.isShiftKeyDown;\n if (!this.isShiftKeyDown) {\n const activeLayer =\n this.#mode === AnnotationEditorType.HIGHLIGHT\n ? this.#getLayerForTextLayer(textLayer)\n : null;\n activeLayer?.toggleDrawing();\n\n if (this.#isPointerDown) {\n const ac = new AbortController();\n const signal = this.combinedSignal(ac);\n\n const pointerup = e => {\n if (e.type === \"pointerup\" && e.button !== 0) {\n // Do nothing on right click.\n return;\n }\n ac.abort();\n activeLayer?.toggleDrawing(true);\n if (e.type === \"pointerup\") {\n this.#onSelectEnd(\"main_toolbar\");\n }\n };\n window.addEventListener(\"pointerup\", pointerup, { signal });\n window.addEventListener(\"blur\", pointerup, { signal });\n } else {\n // Here neither the shift key nor the pointer is down and we've\n // something in the selection: we can be in the case where the user is\n // using a screen reader (see bug 1976597).\n activeLayer?.toggleDrawing(true);\n this.#onSelectEnd(\"main_toolbar\");\n }\n }\n }\n\n #onSelectEnd(methodOfCreation = \"\") {\n if (this.#mode === AnnotationEditorType.HIGHLIGHT) {\n this.highlightSelection(methodOfCreation);\n } else if (this.#enableHighlightFloatingButton) {\n this.#displayFloatingToolbar();\n }\n }\n\n #addSelectionListener() {\n document.addEventListener(\n \"selectionchange\",\n this.#selectionChange.bind(this),\n { signal: this._signal }\n );\n }\n\n #addFocusManager() {\n if (this.#focusManagerAC) {\n return;\n }\n this.#focusManagerAC = new AbortController();\n const signal = this.combinedSignal(this.#focusManagerAC);\n\n window.addEventListener(\"focus\", this.focus.bind(this), { signal });\n window.addEventListener(\"blur\", this.blur.bind(this), { signal });\n }\n\n #removeFocusManager() {\n this.#focusManagerAC?.abort();\n this.#focusManagerAC = null;\n }\n\n blur() {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n if (!this.hasSelection) {\n return;\n }\n // When several editors are selected and the window loses focus, we want to\n // keep the last active element in order to be able to focus it again when\n // the window gets the focus back but we don't want to trigger any focus\n // callbacks else only one editor will be selected.\n const { activeElement } = document;\n for (const editor of this.#selectedEditors) {\n if (editor.div.contains(activeElement)) {\n this.#lastActiveElement = [editor, activeElement];\n editor._focusEventsAllowed = false;\n break;\n }\n }\n }\n\n focus() {\n if (!this.#lastActiveElement) {\n return;\n }\n const [lastEditor, lastActiveElement] = this.#lastActiveElement;\n this.#lastActiveElement = null;\n lastActiveElement.addEventListener(\n \"focusin\",\n () => {\n lastEditor._focusEventsAllowed = true;\n },\n { once: true, signal: this._signal }\n );\n lastActiveElement.focus();\n }\n\n #addKeyboardManager() {\n if (this.#keyboardManagerAC) {\n return;\n }\n this.#keyboardManagerAC = new AbortController();\n const signal = this.combinedSignal(this.#keyboardManagerAC);\n\n // The keyboard events are caught at the container level in order to be able\n // to execute some callbacks even if the current page doesn't have focus.\n window.addEventListener(\"keydown\", this.keydown.bind(this), { signal });\n window.addEventListener(\"keyup\", this.keyup.bind(this), { signal });\n }\n\n #removeKeyboardManager() {\n this.#keyboardManagerAC?.abort();\n this.#keyboardManagerAC = null;\n }\n\n #addCopyPasteListeners() {\n if (this.#copyPasteAC) {\n return;\n }\n this.#copyPasteAC = new AbortController();\n const signal = this.combinedSignal(this.#copyPasteAC);\n\n document.addEventListener(\"copy\", this.copy.bind(this), { signal });\n document.addEventListener(\"cut\", this.cut.bind(this), { signal });\n document.addEventListener(\"paste\", this.paste.bind(this), { signal });\n }\n\n #removeCopyPasteListeners() {\n this.#copyPasteAC?.abort();\n this.#copyPasteAC = null;\n }\n\n #addDragAndDropListeners() {\n const signal = this._signal;\n document.addEventListener(\"dragover\", this.dragOver.bind(this), { signal });\n document.addEventListener(\"drop\", this.drop.bind(this), { signal });\n }\n\n addEditListeners() {\n this.#addKeyboardManager();\n this.#addCopyPasteListeners();\n }\n\n removeEditListeners() {\n this.#removeKeyboardManager();\n this.#removeCopyPasteListeners();\n }\n\n dragOver(event) {\n for (const { type } of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(type)) {\n event.dataTransfer.dropEffect = \"copy\";\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Drop callback.\n * @param {DragEvent} event\n */\n drop(event) {\n for (const item of event.dataTransfer.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n event.preventDefault();\n return;\n }\n }\n }\n }\n\n /**\n * Copy callback.\n * @param {ClipboardEvent} event\n */\n copy(event) {\n event.preventDefault();\n\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n\n if (!this.hasSelection) {\n return;\n }\n\n const editors = [];\n for (const editor of this.#selectedEditors) {\n const serialized = editor.serialize(/* isForCopying = */ true);\n if (serialized) {\n editors.push(serialized);\n }\n }\n if (editors.length === 0) {\n return;\n }\n\n event.clipboardData.setData(\"application/pdfjs\", JSON.stringify(editors));\n }\n\n /**\n * Cut callback.\n * @param {ClipboardEvent} event\n */\n cut(event) {\n this.copy(event);\n this.delete();\n }\n\n /**\n * Paste callback.\n * @param {ClipboardEvent} event\n */\n async paste(event) {\n event.preventDefault();\n const { clipboardData } = event;\n for (const item of clipboardData.items) {\n for (const editorType of this.#editorTypes) {\n if (editorType.isHandlingMimeForPasting(item.type)) {\n editorType.paste(item, this.currentLayer);\n return;\n }\n }\n }\n\n let data = clipboardData.getData(\"application/pdfjs\");\n if (!data) {\n return;\n }\n\n try {\n data = JSON.parse(data);\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n return;\n }\n\n if (!Array.isArray(data)) {\n return;\n }\n\n this.unselectAll();\n const layer = this.currentLayer;\n\n try {\n const newEditors = [];\n for (const editor of data) {\n const deserializedEditor = await layer.deserialize(editor);\n if (!deserializedEditor) {\n return;\n }\n newEditors.push(deserializedEditor);\n }\n\n const cmd = () => {\n for (const editor of newEditors) {\n this.#addEditorToLayer(editor);\n }\n this.#selectEditors(newEditors);\n };\n const undo = () => {\n for (const editor of newEditors) {\n editor.remove();\n }\n };\n this.addCommands({ cmd, undo, mustExec: true });\n } catch (ex) {\n warn(`paste: \"${ex.message}\".`);\n }\n }\n\n /**\n * Keydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (!this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = true;\n }\n if (\n this.#mode !== AnnotationEditorType.NONE &&\n !this.isEditorHandlingKeyboard\n ) {\n AnnotationEditorUIManager._keyboardManager.exec(this, event);\n }\n }\n\n /**\n * Keyup callback.\n * @param {KeyboardEvent} event\n */\n keyup(event) {\n if (this.isShiftKeyDown && event.key === \"Shift\") {\n this.isShiftKeyDown = false;\n if (this.#highlightWhenShiftUp) {\n this.#highlightWhenShiftUp = false;\n this.#onSelectEnd(\"main_toolbar\");\n }\n }\n }\n\n /**\n * Execute an action for a given name.\n * For example, the user can click on the \"Undo\" entry in the context menu\n * and it'll trigger the undo action.\n */\n onEditingAction({ name }) {\n switch (name) {\n case \"undo\":\n case \"redo\":\n case \"delete\":\n case \"selectAll\":\n this[name]();\n break;\n case \"highlightSelection\":\n this.highlightSelection(\"context_menu\");\n break;\n case \"commentSelection\":\n this.commentSelection(\"context_menu\");\n break;\n }\n }\n\n /**\n * Update the different possible states of this manager, e.g. is there\n * something to undo, redo, ...\n * @param {Object} details\n */\n #dispatchUpdateStates(details) {\n const hasChanged = Object.entries(details).some(\n ([key, value]) => this.#previousStates[key] !== value\n );\n\n if (hasChanged) {\n this._eventBus.dispatch(\"annotationeditorstateschanged\", {\n source: this,\n details: Object.assign(this.#previousStates, details),\n });\n // We could listen on our own event but it sounds like a bit weird and\n // it's a way to simpler to handle that stuff here instead of having to\n // add something in every place where an editor can be unselected.\n if (\n this.#mode === AnnotationEditorType.HIGHLIGHT &&\n details.hasSelectedEditor === false\n ) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_FREE, true],\n ]);\n }\n }\n }\n\n #dispatchUpdateUI(details) {\n this._eventBus.dispatch(\"annotationeditorparamschanged\", {\n source: this,\n details,\n });\n }\n\n /**\n * Set the editing state.\n * It can be useful to temporarily disable it when the user is editing a\n * FreeText annotation.\n * @param {boolean} isEditing\n */\n setEditingState(isEditing) {\n if (isEditing) {\n this.#addFocusManager();\n this.#addCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: this.#mode !== AnnotationEditorType.NONE,\n isEmpty: this.#isEmpty(),\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n hasSelectedEditor: false,\n });\n } else {\n this.#removeFocusManager();\n this.#removeCopyPasteListeners();\n this.#dispatchUpdateStates({\n isEditing: false,\n });\n this.disableUserSelect(false);\n }\n }\n\n registerEditorTypes(types) {\n if (this.#editorTypes) {\n return;\n }\n this.#editorTypes = types;\n for (const editorType of this.#editorTypes) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n }\n\n /**\n * Get an id.\n * @returns {string}\n */\n getId() {\n return this.#idManager.id;\n }\n\n get currentLayer() {\n return this.#allLayers.get(this.#currentPageIndex);\n }\n\n getLayer(pageIndex) {\n return this.#allLayers.get(pageIndex);\n }\n\n get currentPageIndex() {\n return this.#currentPageIndex;\n }\n\n /**\n * Add a new layer for a page which will contains the editors.\n * @param {AnnotationEditorLayer} layer\n */\n addLayer(layer) {\n this.#allLayers.set(layer.pageIndex, layer);\n if (this.#isEnabled) {\n layer.enable();\n } else {\n layer.disable();\n }\n }\n\n /**\n * Remove a layer.\n * @param {AnnotationEditorLayer} layer\n */\n removeLayer(layer) {\n this.#allLayers.delete(layer.pageIndex);\n }\n\n /**\n * Change the editor mode (None, FreeText, Ink, ...)\n * @param {number} mode\n * @param {string|null} editId\n * @param {boolean} [isFromKeyboard] - true if the mode change is due to a\n * keyboard action.\n * @param {boolean} [mustEnterInEditMode] - true if the editor must enter in\n * edit mode.\n * @param {boolean} [editComment] - true if the mode change is due to a\n * comment edit.\n */\n async updateMode(\n mode,\n editId = null,\n isFromKeyboard = false,\n mustEnterInEditMode = false,\n editComment = false\n ) {\n if (this.#mode === mode) {\n return;\n }\n\n if (this.#updateModeCapability) {\n await this.#updateModeCapability.promise;\n if (!this.#updateModeCapability) {\n // This ui manager has been destroyed.\n return;\n }\n }\n\n this.#updateModeCapability = Promise.withResolvers();\n this.#currentDrawingSession?.commitOrRemove();\n\n if (this.#mode === AnnotationEditorType.POPUP) {\n this.#commentManager?.hideSidebar();\n }\n this.#commentManager?.destroyPopup();\n\n this.#mode = mode;\n if (mode === AnnotationEditorType.NONE) {\n this.setEditingState(false);\n this.#disableAll();\n for (const editor of this.#allEditors.values()) {\n editor.hideStandaloneCommentButton();\n }\n\n this._editorUndoBar?.hide();\n this.toggleComment(/* editor = */ null);\n\n this.#updateModeCapability.resolve();\n return;\n }\n\n for (const editor of this.#allEditors.values()) {\n editor.addStandaloneCommentButton();\n }\n\n if (mode === AnnotationEditorType.SIGNATURE) {\n await this.#signatureManager?.loadSignatures();\n }\n\n this.setEditingState(true);\n await this.#enableAll();\n this.unselectAll();\n for (const layer of this.#allLayers.values()) {\n layer.updateMode(mode);\n }\n\n if (mode === AnnotationEditorType.POPUP) {\n this.#allEditableAnnotations ||=\n await this.#pdfDocument.getAnnotationsByType(\n new Set(this.#editorTypes.map(editorClass => editorClass._editorType))\n );\n const elementIds = new Set();\n const allComments = [];\n for (const editor of this.#allEditors.values()) {\n const { annotationElementId, hasComment, deleted } = editor;\n if (annotationElementId) {\n elementIds.add(annotationElementId);\n }\n if (hasComment && !deleted) {\n allComments.push(editor.getData());\n }\n }\n for (const annotation of this.#allEditableAnnotations) {\n const { id, popupRef, contentsObj } = annotation;\n if (\n popupRef &&\n contentsObj?.str &&\n !elementIds.has(id) &&\n !this.#deletedAnnotationsElementIds.has(id)\n ) {\n // The annotation exists in the PDF and has a comment but there\n // is no editor for it (anymore).\n allComments.push(annotation);\n }\n }\n this.#commentManager?.showSidebar(allComments);\n }\n\n if (!editId) {\n if (isFromKeyboard) {\n this.addNewEditorFromKeyboard();\n }\n\n this.#updateModeCapability.resolve();\n return;\n }\n\n for (const editor of this.#allEditors.values()) {\n if (editor.uid === editId) {\n this.setSelected(editor);\n if (editComment) {\n editor.editComment();\n } else if (mustEnterInEditMode) {\n editor.enterInEditMode();\n } else {\n editor.focus();\n }\n } else {\n editor.unselect();\n }\n }\n\n this.#updateModeCapability.resolve();\n }\n\n addNewEditorFromKeyboard() {\n if (this.currentLayer.canCreateNewEmptyEditor()) {\n this.currentLayer.addNewEditor();\n }\n }\n\n /**\n * Update the toolbar if it's required to reflect the tool currently used.\n * @param {Object} options\n * @param {number} mode\n * @returns {undefined}\n */\n updateToolbar(options) {\n if (options.mode === this.#mode) {\n return;\n }\n this._eventBus.dispatch(\"switchannotationeditormode\", {\n source: this,\n ...options,\n });\n }\n\n /**\n * Update a parameter in the current editor or globally.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {\n if (!this.#editorTypes) {\n return;\n }\n\n switch (type) {\n case AnnotationEditorParamsType.CREATE:\n this.currentLayer.addNewEditor(value);\n return;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n this._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data: {\n type: \"highlight\",\n action: \"toggle_visibility\",\n },\n },\n });\n (this.#showAllStates ||= new Map()).set(type, value);\n this.showAllEditors(\"highlight\", value);\n break;\n }\n\n if (this.hasSelection) {\n for (const editor of this.#selectedEditors) {\n editor.updateParams(type, value);\n }\n } else {\n for (const editorType of this.#editorTypes) {\n editorType.updateDefaultParams(type, value);\n }\n }\n }\n\n showAllEditors(type, visible, updateButton = false) {\n for (const editor of this.#allEditors.values()) {\n if (editor.editorType === type) {\n editor.show(visible);\n }\n }\n const state =\n this.#showAllStates?.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL) ??\n true;\n if (state !== visible) {\n this.#dispatchUpdateUI([\n [AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible],\n ]);\n }\n }\n\n enableWaiting(mustWait = false) {\n if (this.#isWaiting === mustWait) {\n return;\n }\n this.#isWaiting = mustWait;\n for (const layer of this.#allLayers.values()) {\n if (mustWait) {\n layer.disableClick();\n } else {\n layer.enableClick();\n }\n layer.div.classList.toggle(\"waiting\", mustWait);\n }\n }\n\n /**\n * Enable all the layers.\n */\n async #enableAll() {\n if (!this.#isEnabled) {\n this.#isEnabled = true;\n const promises = [];\n for (const layer of this.#allLayers.values()) {\n promises.push(layer.enable());\n }\n await Promise.all(promises);\n for (const editor of this.#allEditors.values()) {\n editor.enable();\n }\n }\n }\n\n /**\n * Disable all the layers.\n */\n #disableAll() {\n this.unselectAll();\n if (this.#isEnabled) {\n this.#isEnabled = false;\n for (const layer of this.#allLayers.values()) {\n layer.disable();\n }\n for (const editor of this.#allEditors.values()) {\n editor.disable();\n }\n }\n }\n\n /**\n * Get all the editors belonging to a given page.\n * @param {number} pageIndex\n * @yields {AnnotationEditor}\n */\n *getEditors(pageIndex) {\n for (const editor of this.#allEditors.values()) {\n if (editor.pageIndex === pageIndex) {\n yield editor;\n }\n }\n }\n\n /**\n * Get an editor with the given id.\n * @param {string} id\n * @returns {AnnotationEditor}\n */\n getEditor(id) {\n return this.#allEditors.get(id);\n }\n\n /**\n * Add a new editor.\n * @param {AnnotationEditor} editor\n */\n addEditor(editor) {\n this.#allEditors.set(editor.id, editor);\n }\n\n /**\n * Remove an editor.\n * @param {AnnotationEditor} editor\n */\n removeEditor(editor) {\n if (editor.div.contains(document.activeElement)) {\n if (this.#focusMainContainerTimeoutId) {\n clearTimeout(this.#focusMainContainerTimeoutId);\n }\n this.#focusMainContainerTimeoutId = setTimeout(() => {\n // When the div is removed from DOM the focus can move on the\n // document.body, so we need to move it back to the main container.\n this.focusMainContainer();\n this.#focusMainContainerTimeoutId = null;\n }, 0);\n }\n this.#allEditors.delete(editor.id);\n if (editor.annotationElementId) {\n this.#missingCanvases?.delete(editor.annotationElementId);\n }\n this.unselect(editor);\n if (\n !editor.annotationElementId ||\n !this.#deletedAnnotationsElementIds.has(editor.annotationElementId)\n ) {\n this.#annotationStorage?.remove(editor.id);\n }\n }\n\n /**\n * The annotation element with the given id has been deleted.\n * @param {AnnotationEditor} editor\n */\n addDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.add(editor.annotationElementId);\n this.addChangedExistingAnnotation(editor);\n editor.deleted = true;\n }\n\n /**\n * Check if the annotation element with the given id has been deleted.\n * @param {string} annotationElementId\n * @returns {boolean}\n */\n isDeletedAnnotationElement(annotationElementId) {\n return this.#deletedAnnotationsElementIds.has(annotationElementId);\n }\n\n /**\n * The annotation element with the given id have been restored.\n * @param {AnnotationEditor} editor\n */\n removeDeletedAnnotationElement(editor) {\n this.#deletedAnnotationsElementIds.delete(editor.annotationElementId);\n this.removeChangedExistingAnnotation(editor);\n editor.deleted = false;\n }\n\n /**\n * Add an editor to the layer it belongs to or add it to the global map.\n * @param {AnnotationEditor} editor\n */\n #addEditorToLayer(editor) {\n const layer = this.#allLayers.get(editor.pageIndex);\n if (layer) {\n layer.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n }\n }\n\n /**\n * Set the given editor as the active one.\n * @param {AnnotationEditor} editor\n */\n setActiveEditor(editor) {\n if (this.#activeEditor === editor) {\n return;\n }\n\n this.#activeEditor = editor;\n if (editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n get #lastSelectedEditor() {\n let ed = null;\n for (ed of this.#selectedEditors) {\n // Iterate to get the last element.\n }\n return ed;\n }\n\n /**\n * Update the UI of the active editor.\n * @param {AnnotationEditor} editor\n */\n updateUI(editor) {\n if (this.#lastSelectedEditor === editor) {\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n }\n }\n\n updateUIForDefaultProperties(editorType) {\n this.#dispatchUpdateUI(editorType.defaultPropertiesToUpdate);\n }\n\n /**\n * Add or remove an editor the current selection.\n * @param {AnnotationEditor} editor\n */\n toggleSelected(editor) {\n if (this.#selectedEditors.has(editor)) {\n this.#selectedEditors.delete(editor);\n editor.unselect();\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n return;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Set the last selected editor.\n * @param {AnnotationEditor} editor\n */\n setSelected(editor) {\n this.updateToolbar({\n mode: editor.mode,\n editId: editor.id,\n });\n\n this.#currentDrawingSession?.commitOrRemove();\n for (const ed of this.#selectedEditors) {\n if (ed !== editor) {\n ed.unselect();\n }\n }\n this.#selectedEditors.clear();\n\n this.#selectedEditors.add(editor);\n editor.select();\n this.#dispatchUpdateUI(editor.propertiesToUpdate);\n this.#dispatchUpdateStates({\n hasSelectedEditor: true,\n });\n }\n\n /**\n * Check if the editor is selected.\n * @param {AnnotationEditor} editor\n */\n isSelected(editor) {\n return this.#selectedEditors.has(editor);\n }\n\n get firstSelectedEditor() {\n return this.#selectedEditors.values().next().value;\n }\n\n /**\n * Unselect an editor.\n * @param {AnnotationEditor} editor\n */\n unselect(editor) {\n editor.unselect();\n this.#selectedEditors.delete(editor);\n this.#dispatchUpdateStates({\n hasSelectedEditor: this.hasSelection,\n });\n }\n\n get hasSelection() {\n return this.#selectedEditors.size !== 0;\n }\n\n get isEnterHandled() {\n return (\n this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.isEnterHandled\n );\n }\n\n /**\n * Undo the last command.\n */\n undo() {\n this.#commandManager.undo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: this.#commandManager.hasSomethingToUndo(),\n hasSomethingToRedo: true,\n isEmpty: this.#isEmpty(),\n });\n this._editorUndoBar?.hide();\n }\n\n /**\n * Redo the last undoed command.\n */\n redo() {\n this.#commandManager.redo();\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: this.#commandManager.hasSomethingToRedo(),\n isEmpty: this.#isEmpty(),\n });\n }\n\n /**\n * Add a command to execute (cmd) and another one to undo it.\n * @param {Object} params\n */\n addCommands(params) {\n this.#commandManager.add(params);\n this.#dispatchUpdateStates({\n hasSomethingToUndo: true,\n hasSomethingToRedo: false,\n isEmpty: this.#isEmpty(),\n });\n }\n\n cleanUndoStack(type) {\n this.#commandManager.cleanType(type);\n }\n\n #isEmpty() {\n if (this.#allEditors.size === 0) {\n return true;\n }\n\n if (this.#allEditors.size === 1) {\n for (const editor of this.#allEditors.values()) {\n return editor.isEmpty();\n }\n }\n\n return false;\n }\n\n /**\n * Delete the current editor or all.\n */\n delete() {\n this.commitOrRemove();\n const drawingEditor = this.currentLayer?.endDrawingSession(\n /* isAborted = */ true\n );\n if (!this.hasSelection && !drawingEditor) {\n return;\n }\n\n const editors = drawingEditor\n ? [drawingEditor]\n : [...this.#selectedEditors];\n const cmd = () => {\n this._editorUndoBar?.show(\n undo,\n editors.length === 1 ? editors[0].editorType : editors.length\n );\n for (const editor of editors) {\n editor.remove();\n }\n };\n const undo = () => {\n for (const editor of editors) {\n this.#addEditorToLayer(editor);\n }\n };\n\n this.addCommands({ cmd, undo, mustExec: true });\n }\n\n commitOrRemove() {\n // An editor is being edited so just commit it.\n this.#activeEditor?.commitOrRemove();\n }\n\n hasSomethingToControl() {\n return this.#activeEditor || this.hasSelection;\n }\n\n /**\n * Select the editors.\n * @param {Array} editors\n */\n #selectEditors(editors) {\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n for (const editor of editors) {\n if (editor.isEmpty()) {\n continue;\n }\n this.#selectedEditors.add(editor);\n editor.select();\n }\n this.#dispatchUpdateStates({ hasSelectedEditor: this.hasSelection });\n }\n\n /**\n * Select all the editors.\n */\n selectAll() {\n for (const editor of this.#selectedEditors) {\n editor.commit();\n }\n this.#selectEditors(this.#allEditors.values());\n }\n\n /**\n * Unselect all the selected editors.\n */\n unselectAll() {\n if (this.#activeEditor) {\n // An editor is being edited so just commit it.\n this.#activeEditor.commitOrRemove();\n if (this.#mode !== AnnotationEditorType.NONE) {\n // If the mode is NONE, we want to really unselect the editor, hence we\n // mustn't return here.\n return;\n }\n }\n\n if (this.#currentDrawingSession?.commitOrRemove()) {\n return;\n }\n\n if (!this.hasSelection) {\n return;\n }\n for (const editor of this.#selectedEditors) {\n editor.unselect();\n }\n this.#selectedEditors.clear();\n this.#dispatchUpdateStates({\n hasSelectedEditor: false,\n });\n }\n\n translateSelectedEditors(x, y, noCommit = false) {\n if (!noCommit) {\n this.commitOrRemove();\n }\n if (!this.hasSelection) {\n return;\n }\n\n this.#translation[0] += x;\n this.#translation[1] += y;\n const [totalX, totalY] = this.#translation;\n const editors = [...this.#selectedEditors];\n\n // We don't want to have an undo/redo for each translation so we wait a bit\n // before adding the command to the command manager.\n const TIME_TO_WAIT = 1000;\n\n if (this.#translationTimeoutId) {\n clearTimeout(this.#translationTimeoutId);\n }\n\n this.#translationTimeoutId = setTimeout(() => {\n this.#translationTimeoutId = null;\n this.#translation[0] = this.#translation[1] = 0;\n\n this.addCommands({\n cmd: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(totalX, totalY);\n editor.translationDone();\n }\n }\n },\n undo: () => {\n for (const editor of editors) {\n if (this.#allEditors.has(editor.id)) {\n editor.translateInPage(-totalX, -totalY);\n editor.translationDone();\n }\n }\n },\n mustExec: false,\n });\n }, TIME_TO_WAIT);\n\n for (const editor of editors) {\n editor.translateInPage(x, y);\n editor.translationDone();\n }\n }\n\n /**\n * Set up the drag session for moving the selected editors.\n */\n setUpDragSession() {\n // Note: don't use any references to the editor's parent which can be null\n // if the editor belongs to a destroyed page.\n if (!this.hasSelection) {\n return;\n }\n // Avoid to have spurious text selection in the text layer when dragging.\n this.disableUserSelect(true);\n this.#draggingEditors = new Map();\n for (const editor of this.#selectedEditors) {\n this.#draggingEditors.set(editor, {\n savedX: editor.x,\n savedY: editor.y,\n savedPageIndex: editor.pageIndex,\n newX: 0,\n newY: 0,\n newPageIndex: -1,\n });\n }\n }\n\n /**\n * Ends the drag session.\n * @returns {boolean} true if at least one editor has been moved.\n */\n endDragSession() {\n if (!this.#draggingEditors) {\n return false;\n }\n this.disableUserSelect(false);\n const map = this.#draggingEditors;\n this.#draggingEditors = null;\n let mustBeAddedInUndoStack = false;\n\n for (const [{ x, y, pageIndex }, value] of map) {\n value.newX = x;\n value.newY = y;\n value.newPageIndex = pageIndex;\n mustBeAddedInUndoStack ||=\n x !== value.savedX ||\n y !== value.savedY ||\n pageIndex !== value.savedPageIndex;\n }\n\n if (!mustBeAddedInUndoStack) {\n return false;\n }\n\n const move = (editor, x, y, pageIndex) => {\n if (this.#allEditors.has(editor.id)) {\n // The editor can be undone/redone on a page which is not visible (and\n // which potentially has no annotation editor layer), hence we need to\n // use the pageIndex instead of the parent.\n const parent = this.#allLayers.get(pageIndex);\n if (parent) {\n editor._setParentAndPosition(parent, x, y);\n } else {\n editor.pageIndex = pageIndex;\n editor.x = x;\n editor.y = y;\n }\n }\n };\n\n this.addCommands({\n cmd: () => {\n for (const [editor, { newX, newY, newPageIndex }] of map) {\n move(editor, newX, newY, newPageIndex);\n }\n },\n undo: () => {\n for (const [editor, { savedX, savedY, savedPageIndex }] of map) {\n move(editor, savedX, savedY, savedPageIndex);\n }\n },\n mustExec: true,\n });\n\n return true;\n }\n\n /**\n * Drag the set of selected editors.\n * @param {number} tx\n * @param {number} ty\n */\n dragSelectedEditors(tx, ty) {\n if (!this.#draggingEditors) {\n return;\n }\n for (const editor of this.#draggingEditors.keys()) {\n editor.drag(tx, ty);\n }\n }\n\n /**\n * Rebuild the editor (usually on undo/redo actions) on a potentially\n * non-rendered page.\n * @param {AnnotationEditor} editor\n */\n rebuild(editor) {\n if (editor.parent === null) {\n const parent = this.getLayer(editor.pageIndex);\n if (parent) {\n parent.changeParent(editor);\n parent.addOrRebuild(editor);\n } else {\n this.addEditor(editor);\n this.addToAnnotationStorage(editor);\n editor.rebuild();\n }\n } else {\n editor.parent.addOrRebuild(editor);\n }\n }\n\n get isEditorHandlingKeyboard() {\n return (\n this.getActive()?.shouldGetKeyboardEvents() ||\n (this.#selectedEditors.size === 1 &&\n this.firstSelectedEditor.shouldGetKeyboardEvents())\n );\n }\n\n /**\n * Is the current editor the one passed as argument?\n * @param {AnnotationEditor} editor\n * @returns\n */\n isActive(editor) {\n return this.#activeEditor === editor;\n }\n\n /**\n * Get the current active editor.\n * @returns {AnnotationEditor|null}\n */\n getActive() {\n return this.#activeEditor;\n }\n\n /**\n * Get the current editor mode.\n * @returns {number}\n */\n getMode() {\n return this.#mode;\n }\n\n isEditingMode() {\n return this.#mode !== AnnotationEditorType.NONE;\n }\n\n get imageManager() {\n return shadow(this, \"imageManager\", new ImageManager());\n }\n\n getSelectionBoxes(textLayer) {\n if (!textLayer) {\n return null;\n }\n const selection = document.getSelection();\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n if (\n !textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)\n ) {\n return null;\n }\n }\n\n const {\n x: layerX,\n y: layerY,\n width: parentWidth,\n height: parentHeight,\n } = textLayer.getBoundingClientRect();\n\n // We must rotate the boxes because we want to have them in the non-rotated\n // page coordinates.\n let rotator;\n switch (textLayer.getAttribute(\"data-main-rotation\")) {\n case \"90\":\n rotator = (x, y, w, h) => ({\n x: (y - layerY) / parentHeight,\n y: 1 - (x + w - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n case \"180\":\n rotator = (x, y, w, h) => ({\n x: 1 - (x + w - layerX) / parentWidth,\n y: 1 - (y + h - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n case \"270\":\n rotator = (x, y, w, h) => ({\n x: 1 - (y + h - layerY) / parentHeight,\n y: (x - layerX) / parentWidth,\n width: h / parentHeight,\n height: w / parentWidth,\n });\n break;\n default:\n rotator = (x, y, w, h) => ({\n x: (x - layerX) / parentWidth,\n y: (y - layerY) / parentHeight,\n width: w / parentWidth,\n height: h / parentHeight,\n });\n break;\n }\n\n const boxes = [];\n for (let i = 0, ii = selection.rangeCount; i < ii; i++) {\n const range = selection.getRangeAt(i);\n if (range.collapsed) {\n continue;\n }\n for (const { x, y, width, height } of range.getClientRects()) {\n if (width === 0 || height === 0) {\n continue;\n }\n boxes.push(rotator(x, y, width, height));\n }\n }\n return boxes.length === 0 ? null : boxes;\n }\n\n addChangedExistingAnnotation({ annotationElementId, id }) {\n (this.#changedExistingAnnotations ||= new Map()).set(\n annotationElementId,\n id\n );\n }\n\n removeChangedExistingAnnotation({ annotationElementId }) {\n this.#changedExistingAnnotations?.delete(annotationElementId);\n }\n\n renderAnnotationElement(annotation) {\n const editorId = this.#changedExistingAnnotations?.get(annotation.data.id);\n if (!editorId) {\n return;\n }\n const editor = this.#annotationStorage.getRawValue(editorId);\n if (!editor) {\n return;\n }\n if (this.#mode === AnnotationEditorType.NONE && !editor.hasBeenModified) {\n return;\n }\n editor.renderAnnotationElement(annotation);\n }\n\n setMissingCanvas(annotationId, annotationElementId, canvas) {\n const editor = this.#missingCanvases?.get(annotationId);\n if (!editor) {\n return;\n }\n editor.setCanvas(annotationElementId, canvas);\n this.#missingCanvases.delete(annotationId);\n }\n\n addMissingCanvas(annotationId, editor) {\n (this.#missingCanvases ||= new Map()).set(annotationId, editor);\n }\n}\n\nexport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n CommandManager,\n KeyboardManager,\n};\n","/* Copyright 2023 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\nimport { noContextMenu } from \"../display_utils.js\";\n\nclass AltText {\n #altText = null;\n\n #altTextDecorative = false;\n\n #altTextButton = null;\n\n #altTextButtonLabel = null;\n\n #altTextTooltip = null;\n\n #altTextTooltipTimeout = null;\n\n #altTextWasFromKeyBoard = false;\n\n #badge = null;\n\n #editor = null;\n\n #guessedText = null;\n\n #textWithDisclaimer = null;\n\n #useNewAltTextFlow = false;\n\n static #l10nNewButton = null;\n\n static _l10n = null;\n\n constructor(editor) {\n this.#editor = editor;\n this.#useNewAltTextFlow = editor._uiManager.useNewAltTextFlow;\n\n AltText.#l10nNewButton ||= Object.freeze({\n added: \"pdfjs-editor-new-alt-text-added-button\",\n \"added-label\": \"pdfjs-editor-new-alt-text-added-button-label\",\n missing: \"pdfjs-editor-new-alt-text-missing-button\",\n \"missing-label\": \"pdfjs-editor-new-alt-text-missing-button-label\",\n review: \"pdfjs-editor-new-alt-text-to-review-button\",\n \"review-label\": \"pdfjs-editor-new-alt-text-to-review-button-label\",\n });\n }\n\n static initialize(l10n) {\n AltText._l10n ??= l10n;\n }\n\n async render() {\n const altText = (this.#altTextButton = document.createElement(\"button\"));\n altText.className = \"altText\";\n altText.tabIndex = \"0\";\n\n const label = (this.#altTextButtonLabel = document.createElement(\"span\"));\n altText.append(label);\n\n if (this.#useNewAltTextFlow) {\n altText.classList.add(\"new\");\n altText.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton.missing);\n label.setAttribute(\n \"data-l10n-id\",\n AltText.#l10nNewButton[\"missing-label\"]\n );\n } else {\n altText.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button\");\n label.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-button-label\");\n }\n\n const signal = this.#editor._uiManager._signal;\n altText.addEventListener(\"contextmenu\", noContextMenu, { signal });\n altText.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n signal,\n });\n\n const onClick = event => {\n event.preventDefault();\n this.#editor._uiManager.editAltText(this.#editor);\n if (this.#useNewAltTextFlow) {\n this.#editor._reportTelemetry({\n action: \"pdfjs.image.alt_text.image_status_label_clicked\",\n data: { label: this.#label },\n });\n }\n };\n altText.addEventListener(\"click\", onClick, { capture: true, signal });\n altText.addEventListener(\n \"keydown\",\n event => {\n if (event.target === altText && event.key === \"Enter\") {\n this.#altTextWasFromKeyBoard = true;\n onClick(event);\n }\n },\n { signal }\n );\n await this.#setState();\n\n return altText;\n }\n\n get #label() {\n return (\n (this.#altText && \"added\") ||\n (this.#altText === null && this.guessedText && \"review\") ||\n \"missing\"\n );\n }\n\n finish() {\n if (!this.#altTextButton) {\n return;\n }\n this.#altTextButton.focus({ focusVisible: this.#altTextWasFromKeyBoard });\n this.#altTextWasFromKeyBoard = false;\n }\n\n isEmpty() {\n if (this.#useNewAltTextFlow) {\n return this.#altText === null;\n }\n return !this.#altText && !this.#altTextDecorative;\n }\n\n hasData() {\n if (this.#useNewAltTextFlow) {\n return this.#altText !== null || !!this.#guessedText;\n }\n return this.isEmpty();\n }\n\n get guessedText() {\n return this.#guessedText;\n }\n\n async setGuessedText(guessedText) {\n if (this.#altText !== null) {\n // The user provided their own alt text, so we don't want to overwrite it.\n return;\n }\n this.#guessedText = guessedText;\n this.#textWithDisclaimer = await AltText._l10n.get(\n \"pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer\",\n { generatedAltText: guessedText }\n );\n this.#setState();\n }\n\n toggleAltTextBadge(visibility = false) {\n if (!this.#useNewAltTextFlow || this.#altText) {\n this.#badge?.remove();\n this.#badge = null;\n return;\n }\n if (!this.#badge) {\n const badge = (this.#badge = document.createElement(\"div\"));\n badge.className = \"noAltTextBadge\";\n this.#editor.div.append(badge);\n }\n this.#badge.classList.toggle(\"hidden\", !visibility);\n }\n\n serialize(isForCopying) {\n let altText = this.#altText;\n if (!isForCopying && this.#guessedText === altText) {\n altText = this.#textWithDisclaimer;\n }\n return {\n altText,\n decorative: this.#altTextDecorative,\n guessedText: this.#guessedText,\n textWithDisclaimer: this.#textWithDisclaimer,\n };\n }\n\n get data() {\n return {\n altText: this.#altText,\n decorative: this.#altTextDecorative,\n };\n }\n\n /**\n * Set the alt text data.\n */\n set data({\n altText,\n decorative,\n guessedText,\n textWithDisclaimer,\n cancel = false,\n }) {\n if (guessedText) {\n this.#guessedText = guessedText;\n this.#textWithDisclaimer = textWithDisclaimer;\n }\n if (this.#altText === altText && this.#altTextDecorative === decorative) {\n return;\n }\n if (!cancel) {\n this.#altText = altText;\n this.#altTextDecorative = decorative;\n }\n this.#setState();\n }\n\n toggle(enabled = false) {\n if (!this.#altTextButton) {\n return;\n }\n if (!enabled && this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextButton.disabled = !enabled;\n }\n\n shown() {\n this.#editor._reportTelemetry({\n action: \"pdfjs.image.alt_text.image_status_label_displayed\",\n data: { label: this.#label },\n });\n }\n\n destroy() {\n this.#altTextButton?.remove();\n this.#altTextButton = null;\n this.#altTextButtonLabel = null;\n this.#altTextTooltip = null;\n this.#badge?.remove();\n this.#badge = null;\n }\n\n async #setState() {\n const button = this.#altTextButton;\n if (!button) {\n return;\n }\n\n if (this.#useNewAltTextFlow) {\n button.classList.toggle(\"done\", !!this.#altText);\n button.setAttribute(\"data-l10n-id\", AltText.#l10nNewButton[this.#label]);\n\n this.#altTextButtonLabel?.setAttribute(\n \"data-l10n-id\",\n AltText.#l10nNewButton[`${this.#label}-label`]\n );\n if (!this.#altText) {\n this.#altTextTooltip?.remove();\n return;\n }\n } else {\n if (!this.#altText && !this.#altTextDecorative) {\n button.classList.remove(\"done\");\n this.#altTextTooltip?.remove();\n return;\n }\n button.classList.add(\"done\");\n button.setAttribute(\"data-l10n-id\", \"pdfjs-editor-alt-text-edit-button\");\n }\n\n let tooltip = this.#altTextTooltip;\n if (!tooltip) {\n this.#altTextTooltip = tooltip = document.createElement(\"span\");\n tooltip.className = \"tooltip\";\n tooltip.setAttribute(\"role\", \"tooltip\");\n tooltip.id = `alt-text-tooltip-${this.#editor.id}`;\n\n const DELAY_TO_SHOW_TOOLTIP = 100;\n const signal = this.#editor._uiManager._signal;\n signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n },\n { once: true }\n );\n button.addEventListener(\n \"mouseenter\",\n () => {\n this.#altTextTooltipTimeout = setTimeout(() => {\n this.#altTextTooltipTimeout = null;\n this.#altTextTooltip.classList.add(\"show\");\n this.#editor._reportTelemetry({\n action: \"alt_text_tooltip\",\n });\n }, DELAY_TO_SHOW_TOOLTIP);\n },\n { signal }\n );\n button.addEventListener(\n \"mouseleave\",\n () => {\n if (this.#altTextTooltipTimeout) {\n clearTimeout(this.#altTextTooltipTimeout);\n this.#altTextTooltipTimeout = null;\n }\n this.#altTextTooltip?.classList.remove(\"show\");\n },\n { signal }\n );\n }\n if (this.#altTextDecorative) {\n tooltip.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-decorative-tooltip\"\n );\n } else {\n tooltip.removeAttribute(\"data-l10n-id\");\n tooltip.textContent = this.#altText;\n }\n\n if (!tooltip.parentNode) {\n button.append(tooltip);\n }\n\n const element = this.#editor.getElementForAltText();\n element?.setAttribute(\"aria-describedby\", tooltip.id);\n }\n}\n\nexport { AltText };\n","/* Copyright 2025 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\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\n\nclass Comment {\n #commentStandaloneButton = null;\n\n #commentToolbarButton = null;\n\n #commentWasFromKeyBoard = false;\n\n #editor = null;\n\n #initialText = null;\n\n #richText = null;\n\n #text = null;\n\n #date = null;\n\n #deleted = false;\n\n #popupPosition = null;\n\n constructor(editor) {\n this.#editor = editor;\n }\n\n renderForToolbar() {\n const button = (this.#commentToolbarButton =\n document.createElement(\"button\"));\n button.className = \"comment\";\n return this.#render(button, false);\n }\n\n renderForStandalone() {\n const button = (this.#commentStandaloneButton =\n document.createElement(\"button\"));\n button.className = \"annotationCommentButton\";\n\n const position = this.#editor.commentButtonPosition;\n if (position) {\n const { style } = button;\n style.insetInlineEnd = `calc(${\n 100 *\n (this.#editor._uiManager.direction === \"ltr\"\n ? 1 - position[0]\n : position[0])\n }% - var(--comment-button-dim))`;\n style.top = `calc(${100 * position[1]}% - var(--comment-button-dim))`;\n const color = this.#editor.commentButtonColor;\n if (color) {\n style.backgroundColor = color;\n }\n }\n\n return this.#render(button, true);\n }\n\n focusButton() {\n setTimeout(() => {\n (this.#commentStandaloneButton ?? this.#commentToolbarButton)?.focus();\n }, 0);\n }\n\n onUpdatedColor() {\n if (!this.#commentStandaloneButton) {\n return;\n }\n const color = this.#editor.commentButtonColor;\n if (color) {\n this.#commentStandaloneButton.style.backgroundColor = color;\n }\n this.#editor._uiManager.updatePopupColor(this.#editor);\n }\n\n get commentButtonWidth() {\n return (\n (this.#commentStandaloneButton?.getBoundingClientRect().width ?? 0) /\n this.#editor.parent.boundingClientRect.width\n );\n }\n\n get commentPopupPositionInLayer() {\n if (this.#popupPosition) {\n return this.#popupPosition;\n }\n if (!this.#commentStandaloneButton) {\n return null;\n }\n const { x, y, height } =\n this.#commentStandaloneButton.getBoundingClientRect();\n const {\n x: parentX,\n y: parentY,\n width: parentWidth,\n height: parentHeight,\n } = this.#editor.parent.boundingClientRect;\n return [(x - parentX) / parentWidth, (y + height - parentY) / parentHeight];\n }\n\n set commentPopupPositionInLayer(pos) {\n this.#popupPosition = pos;\n }\n\n hasDefaultPopupPosition() {\n return this.#popupPosition === null;\n }\n\n removeStandaloneCommentButton() {\n this.#commentStandaloneButton?.remove();\n this.#commentStandaloneButton = null;\n }\n\n removeToolbarCommentButton() {\n this.#commentToolbarButton?.remove();\n this.#commentToolbarButton = null;\n }\n\n setCommentButtonStates({ selected, hasPopup }) {\n if (!this.#commentStandaloneButton) {\n return;\n }\n this.#commentStandaloneButton.classList.toggle(\"selected\", selected);\n this.#commentStandaloneButton.ariaExpanded = hasPopup;\n }\n\n #render(comment, isStandalone) {\n if (!this.#editor._uiManager.hasCommentManager()) {\n return null;\n }\n\n comment.tabIndex = \"0\";\n comment.ariaHasPopup = \"dialog\";\n\n if (isStandalone) {\n comment.ariaControls = \"commentPopup\";\n comment.setAttribute(\"data-l10n-id\", \"pdfjs-show-comment-button\");\n } else {\n comment.ariaControlsElements = [\n this.#editor._uiManager.getCommentDialogElement(),\n ];\n comment.setAttribute(\"data-l10n-id\", \"pdfjs-editor-edit-comment-button\");\n }\n\n const signal = this.#editor._uiManager._signal;\n if (!(signal instanceof AbortSignal) || signal.aborted) {\n return comment;\n }\n\n comment.addEventListener(\"contextmenu\", noContextMenu, { signal });\n if (isStandalone) {\n comment.addEventListener(\n \"focusin\",\n e => {\n this.#editor._focusEventsAllowed = false;\n stopEvent(e);\n },\n {\n capture: true,\n signal,\n }\n );\n comment.addEventListener(\n \"focusout\",\n e => {\n this.#editor._focusEventsAllowed = true;\n stopEvent(e);\n },\n {\n capture: true,\n signal,\n }\n );\n }\n comment.addEventListener(\"pointerdown\", event => event.stopPropagation(), {\n signal,\n });\n\n const onClick = event => {\n event.preventDefault();\n if (comment === this.#commentToolbarButton) {\n this.edit();\n } else {\n this.#editor.toggleComment(/* isSelected = */ true);\n }\n };\n comment.addEventListener(\"click\", onClick, { capture: true, signal });\n comment.addEventListener(\n \"keydown\",\n event => {\n if (event.target === comment && event.key === \"Enter\") {\n this.#commentWasFromKeyBoard = true;\n onClick(event);\n }\n },\n { signal }\n );\n\n comment.addEventListener(\n \"pointerenter\",\n () => {\n this.#editor.toggleComment(\n /* isSelected = */ false,\n /* visibility = */ true\n );\n },\n { signal }\n );\n comment.addEventListener(\n \"pointerleave\",\n () => {\n this.#editor.toggleComment(\n /* isSelected = */ false,\n /* visibility = */ false\n );\n },\n { signal }\n );\n\n return comment;\n }\n\n edit(options) {\n const position = this.commentPopupPositionInLayer;\n let posX, posY;\n if (position) {\n [posX, posY] = position;\n } else {\n // The position is in the editor coordinates.\n [posX, posY] = this.#editor.commentButtonPosition;\n const { width, height, x, y } = this.#editor;\n posX = x + posX * width;\n posY = y + posY * height;\n }\n const parentDimensions = this.#editor.parent.boundingClientRect;\n const {\n x: parentX,\n y: parentY,\n width: parentWidth,\n height: parentHeight,\n } = parentDimensions;\n this.#editor._uiManager.editComment(\n this.#editor,\n parentX + posX * parentWidth,\n parentY + posY * parentHeight,\n { ...options, parentDimensions }\n );\n }\n\n finish() {\n if (!this.#commentToolbarButton) {\n return;\n }\n this.#commentToolbarButton.focus({\n focusVisible: this.#commentWasFromKeyBoard,\n });\n this.#commentWasFromKeyBoard = false;\n }\n\n isDeleted() {\n return this.#deleted || this.#text === \"\";\n }\n\n isEmpty() {\n return this.#text === null;\n }\n\n hasBeenEdited() {\n return this.isDeleted() || this.#text !== this.#initialText;\n }\n\n serialize() {\n return this.data;\n }\n\n get data() {\n return {\n text: this.#text,\n richText: this.#richText,\n date: this.#date,\n deleted: this.isDeleted(),\n };\n }\n\n /**\n * Set the comment data.\n */\n set data(text) {\n if (text !== this.#text) {\n this.#richText = null;\n }\n if (text === null) {\n this.#text = \"\";\n this.#deleted = true;\n return;\n }\n this.#text = text;\n this.#date = new Date();\n this.#deleted = false;\n }\n\n setInitialText(text, richText = null) {\n this.#initialText = text;\n this.data = text;\n this.#date = null;\n this.#richText = richText;\n }\n\n shown() {}\n\n destroy() {\n this.#commentToolbarButton?.remove();\n this.#commentToolbarButton = null;\n this.#commentStandaloneButton?.remove();\n this.#commentStandaloneButton = null;\n this.#text = \"\";\n this.#richText = null;\n this.#date = null;\n this.#editor = null;\n this.#commentWasFromKeyBoard = false;\n this.#deleted = false;\n }\n}\n\nexport { Comment };\n","/* Copyright 2024 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\nimport { OutputScale, stopEvent } from \"./display_utils.js\";\n\nclass TouchManager {\n #container;\n\n #isPinching = false;\n\n #isPinchingStopped = null;\n\n #isPinchingDisabled;\n\n #onPinchStart;\n\n #onPinching;\n\n #onPinchEnd;\n\n #pointerDownAC = null;\n\n #signal;\n\n #touchInfo = null;\n\n #touchManagerAC;\n\n #touchMoveAC = null;\n\n constructor({\n container,\n isPinchingDisabled = null,\n isPinchingStopped = null,\n onPinchStart = null,\n onPinching = null,\n onPinchEnd = null,\n signal,\n }) {\n this.#container = container;\n this.#isPinchingStopped = isPinchingStopped;\n this.#isPinchingDisabled = isPinchingDisabled;\n this.#onPinchStart = onPinchStart;\n this.#onPinching = onPinching;\n this.#onPinchEnd = onPinchEnd;\n this.#touchManagerAC = new AbortController();\n this.#signal = AbortSignal.any([signal, this.#touchManagerAC.signal]);\n\n container.addEventListener(\"touchstart\", this.#onTouchStart.bind(this), {\n passive: false,\n signal: this.#signal,\n });\n }\n\n /**\n * NOTE: Don't shadow this value since `devicePixelRatio` may change if the\n * window resolution changes, e.g. if the viewer is moved to another monitor.\n */\n get MIN_TOUCH_DISTANCE_TO_PINCH() {\n // The 35 is coming from:\n // https://searchfox.org/mozilla-central/source/gfx/layers/apz/src/GestureEventListener.cpp#36\n //\n // The properties TouchEvent::screenX/Y are in screen CSS pixels:\n // https://developer.mozilla.org/en-US/docs/Web/API/Touch/screenX#examples\n // MIN_TOUCH_DISTANCE_TO_PINCH is in CSS pixels.\n return 35 / OutputScale.pixelRatio;\n }\n\n #onTouchStart(evt) {\n if (this.#isPinchingDisabled?.()) {\n return;\n }\n\n if (evt.touches.length === 1) {\n if (this.#pointerDownAC) {\n return;\n }\n const pointerDownAC = (this.#pointerDownAC = new AbortController());\n const signal = AbortSignal.any([this.#signal, pointerDownAC.signal]);\n const container = this.#container;\n\n // We want to have the events at the capture phase to make sure we can\n // cancel them.\n const opts = { capture: true, signal, passive: false };\n const cancelPointerDown = e => {\n if (e.pointerType === \"touch\") {\n this.#pointerDownAC?.abort();\n this.#pointerDownAC = null;\n }\n };\n container.addEventListener(\n \"pointerdown\",\n e => {\n if (e.pointerType === \"touch\") {\n // This is the second finger so we don't want it select something\n // or whatever.\n stopEvent(e);\n cancelPointerDown(e);\n }\n },\n opts\n );\n container.addEventListener(\"pointerup\", cancelPointerDown, opts);\n container.addEventListener(\"pointercancel\", cancelPointerDown, opts);\n return;\n }\n\n if (!this.#touchMoveAC) {\n this.#touchMoveAC = new AbortController();\n const signal = AbortSignal.any([this.#signal, this.#touchMoveAC.signal]);\n const container = this.#container;\n\n const opt = { signal, capture: false, passive: false };\n container.addEventListener(\n \"touchmove\",\n this.#onTouchMove.bind(this),\n opt\n );\n const onTouchEnd = this.#onTouchEnd.bind(this);\n container.addEventListener(\"touchend\", onTouchEnd, opt);\n container.addEventListener(\"touchcancel\", onTouchEnd, opt);\n\n opt.capture = true;\n container.addEventListener(\"pointerdown\", stopEvent, opt);\n container.addEventListener(\"pointermove\", stopEvent, opt);\n container.addEventListener(\"pointercancel\", stopEvent, opt);\n container.addEventListener(\"pointerup\", stopEvent, opt);\n this.#onPinchStart?.();\n }\n\n stopEvent(evt);\n\n if (evt.touches.length !== 2 || this.#isPinchingStopped?.()) {\n this.#touchInfo = null;\n return;\n }\n\n let [touch0, touch1] = evt.touches;\n if (touch0.identifier > touch1.identifier) {\n [touch0, touch1] = [touch1, touch0];\n }\n this.#touchInfo = {\n touch0X: touch0.screenX,\n touch0Y: touch0.screenY,\n touch1X: touch1.screenX,\n touch1Y: touch1.screenY,\n };\n }\n\n #onTouchMove(evt) {\n if (!this.#touchInfo || evt.touches.length !== 2) {\n return;\n }\n\n stopEvent(evt);\n\n let [touch0, touch1] = evt.touches;\n if (touch0.identifier > touch1.identifier) {\n [touch0, touch1] = [touch1, touch0];\n }\n const { screenX: screen0X, screenY: screen0Y } = touch0;\n const { screenX: screen1X, screenY: screen1Y } = touch1;\n const touchInfo = this.#touchInfo;\n const {\n touch0X: pTouch0X,\n touch0Y: pTouch0Y,\n touch1X: pTouch1X,\n touch1Y: pTouch1Y,\n } = touchInfo;\n\n const prevGapX = pTouch1X - pTouch0X;\n const prevGapY = pTouch1Y - pTouch0Y;\n const currGapX = screen1X - screen0X;\n const currGapY = screen1Y - screen0Y;\n\n const distance = Math.hypot(currGapX, currGapY) || 1;\n const pDistance = Math.hypot(prevGapX, prevGapY) || 1;\n if (\n !this.#isPinching &&\n Math.abs(pDistance - distance) <= TouchManager.MIN_TOUCH_DISTANCE_TO_PINCH\n ) {\n return;\n }\n\n touchInfo.touch0X = screen0X;\n touchInfo.touch0Y = screen0Y;\n touchInfo.touch1X = screen1X;\n touchInfo.touch1Y = screen1Y;\n\n if (!this.#isPinching) {\n // Start pinching.\n this.#isPinching = true;\n\n // We return here else the first pinch is a bit too much\n return;\n }\n\n const origin = [(screen0X + screen1X) / 2, (screen0Y + screen1Y) / 2];\n this.#onPinching?.(origin, pDistance, distance);\n }\n\n #onTouchEnd(evt) {\n if (evt.touches.length >= 2) {\n return;\n }\n // #touchMoveAC shouldn't be null but it seems that irl it can (see #19793).\n if (this.#touchMoveAC) {\n this.#touchMoveAC.abort();\n this.#touchMoveAC = null;\n this.#onPinchEnd?.();\n }\n\n if (!this.#touchInfo) {\n return;\n }\n stopEvent(evt);\n this.#touchInfo = null;\n this.#isPinching = false;\n }\n\n destroy() {\n this.#touchManagerAC?.abort();\n this.#touchManagerAC = null;\n this.#pointerDownAC?.abort();\n this.#pointerDownAC = null;\n }\n}\n\nexport { TouchManager };\n","/* Copyright 2022 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// eslint-disable-next-line max-len\n/** @typedef {import(\"./annotation_editor_layer.js\").AnnotationEditorLayer} AnnotationEditorLayer */\n\nimport {\n AnnotationEditorUIManager,\n bindEvents,\n ColorManager,\n KeyboardManager,\n} from \"./tools.js\";\nimport {\n FeatureTest,\n MathClamp,\n shadow,\n unreachable,\n} from \"../../shared/util.js\";\nimport { noContextMenu, stopEvent } from \"../display_utils.js\";\nimport { AltText } from \"./alt_text.js\";\nimport { Comment } from \"./comment.js\";\nimport { EditorToolbar } from \"./toolbar.js\";\nimport { TouchManager } from \"../touch_manager.js\";\n\n/**\n * @typedef {Object} AnnotationEditorParameters\n * @property {AnnotationEditorUIManager} uiManager - the global manager\n * @property {AnnotationEditorLayer} parent - the layer containing this editor\n * @property {string} id - editor id\n * @property {number} x - x-coordinate\n * @property {number} y - y-coordinate\n */\n\n/**\n * Base class for editors.\n */\nclass AnnotationEditor {\n #accessibilityData = null;\n\n #allResizerDivs = null;\n\n #altText = null;\n\n #comment = null;\n\n #commentStandaloneButton = null;\n\n #disabled = false;\n\n #dragPointerId = null;\n\n #dragPointerType = \"\";\n\n #resizersDiv = null;\n\n #lastPointerCoords = null;\n\n #savedDimensions = null;\n\n #fakeAnnotation = null;\n\n #focusAC = null;\n\n #focusedResizerName = \"\";\n\n #hasBeenClicked = false;\n\n #initialRect = null;\n\n #isEditing = false;\n\n #isInEditMode = false;\n\n #isResizerEnabledForKeyboard = false;\n\n #moveInDOMTimeout = null;\n\n #prevDragX = 0;\n\n #prevDragY = 0;\n\n #telemetryTimeouts = null;\n\n #touchManager = null;\n\n isSelected = false;\n\n _isCopy = false;\n\n _editToolbar = null;\n\n _initialOptions = Object.create(null);\n\n _initialData = null;\n\n _isVisible = true;\n\n _uiManager = null;\n\n _focusEventsAllowed = true;\n\n static _l10n = null;\n\n static _l10nResizer = null;\n\n #isDraggable = false;\n\n #zIndex = AnnotationEditor._zIndex++;\n\n static _borderLineWidth = -1;\n\n static _colorManager = new ColorManager();\n\n static _zIndex = 1;\n\n // Time to wait (in ms) before sending the telemetry data.\n // We wait a bit to avoid sending too many requests when changing something\n // like the thickness of a line.\n static _telemetryTimeout = 1000;\n\n static get _resizerKeyboardManager() {\n const resize = AnnotationEditor.prototype._resizeWithKeyboard;\n const small = AnnotationEditorUIManager.TRANSLATE_SMALL;\n const big = AnnotationEditorUIManager.TRANSLATE_BIG;\n\n return shadow(\n this,\n \"_resizerKeyboardManager\",\n new KeyboardManager([\n [[\"ArrowLeft\", \"mac+ArrowLeft\"], resize, { args: [-small, 0] }],\n [\n [\"ctrl+ArrowLeft\", \"mac+shift+ArrowLeft\"],\n resize,\n { args: [-big, 0] },\n ],\n [[\"ArrowRight\", \"mac+ArrowRight\"], resize, { args: [small, 0] }],\n [\n [\"ctrl+ArrowRight\", \"mac+shift+ArrowRight\"],\n resize,\n { args: [big, 0] },\n ],\n [[\"ArrowUp\", \"mac+ArrowUp\"], resize, { args: [0, -small] }],\n [[\"ctrl+ArrowUp\", \"mac+shift+ArrowUp\"], resize, { args: [0, -big] }],\n [[\"ArrowDown\", \"mac+ArrowDown\"], resize, { args: [0, small] }],\n [[\"ctrl+ArrowDown\", \"mac+shift+ArrowDown\"], resize, { args: [0, big] }],\n [\n [\"Escape\", \"mac+Escape\"],\n AnnotationEditor.prototype._stopResizingWithKeyboard,\n ],\n ])\n );\n }\n\n /**\n * @param {AnnotationEditorParameters} parameters\n */\n constructor(parameters) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === AnnotationEditor\n ) {\n unreachable(\"Cannot initialize AnnotationEditor.\");\n }\n\n this.parent = parameters.parent;\n this.id = parameters.id;\n this.width = this.height = null;\n this.pageIndex = parameters.parent.pageIndex;\n this.name = parameters.name;\n this.div = null;\n this._uiManager = parameters.uiManager;\n this.annotationElementId = null;\n this._willKeepAspectRatio = false;\n this._initialOptions.isCentered = parameters.isCentered;\n this._structTreeParentId = null;\n this.annotationElementId = parameters.annotationElementId || null;\n this.creationDate = parameters.creationDate || new Date();\n this.modificationDate = parameters.modificationDate || null;\n\n const {\n rotation,\n rawDims: { pageWidth, pageHeight, pageX, pageY },\n } = this.parent.viewport;\n\n this.rotation = rotation;\n this.pageRotation =\n (360 + rotation - this._uiManager.viewParameters.rotation) % 360;\n this.pageDimensions = [pageWidth, pageHeight];\n this.pageTranslation = [pageX, pageY];\n\n const [width, height] = this.parentDimensions;\n this.x = parameters.x / width;\n this.y = parameters.y / height;\n\n this.isAttachedToDOM = false;\n this.deleted = false;\n }\n\n get editorType() {\n return Object.getPrototypeOf(this).constructor._type;\n }\n\n get mode() {\n return Object.getPrototypeOf(this).constructor._editorType;\n }\n\n static get isDrawer() {\n return false;\n }\n\n static get _defaultLineColor() {\n return shadow(\n this,\n \"_defaultLineColor\",\n this._colorManager.getHexCode(\"CanvasText\")\n );\n }\n\n static deleteAnnotationElement(editor) {\n const fakeEditor = new FakeEditor({\n id: editor.parent.getNextId(),\n parent: editor.parent,\n uiManager: editor._uiManager,\n });\n fakeEditor.annotationElementId = editor.annotationElementId;\n fakeEditor.deleted = true;\n fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);\n }\n\n /**\n * Initialize the l10n stuff for this type of editor.\n * @param {Object} l10n\n */\n static initialize(l10n, _uiManager) {\n AnnotationEditor._l10n ??= l10n;\n\n AnnotationEditor._l10nResizer ||= Object.freeze({\n topLeft: \"pdfjs-editor-resizer-top-left\",\n topMiddle: \"pdfjs-editor-resizer-top-middle\",\n topRight: \"pdfjs-editor-resizer-top-right\",\n middleRight: \"pdfjs-editor-resizer-middle-right\",\n bottomRight: \"pdfjs-editor-resizer-bottom-right\",\n bottomMiddle: \"pdfjs-editor-resizer-bottom-middle\",\n bottomLeft: \"pdfjs-editor-resizer-bottom-left\",\n middleLeft: \"pdfjs-editor-resizer-middle-left\",\n });\n\n if (AnnotationEditor._borderLineWidth !== -1) {\n return;\n }\n const style = getComputedStyle(document.documentElement);\n AnnotationEditor._borderLineWidth =\n parseFloat(style.getPropertyValue(\"--outline-width\")) || 0;\n }\n\n /**\n * Update the default parameters for this type of editor.\n * @param {number} _type\n * @param {*} _value\n */\n static updateDefaultParams(_type, _value) {}\n\n /**\n * Get the default properties to set in the UI for this type of editor.\n * @returns {Array}\n */\n static get defaultPropertiesToUpdate() {\n return [];\n }\n\n /**\n * Check if this kind of editor is able to handle the given mime type for\n * pasting.\n * @param {string} mime\n * @returns {boolean}\n */\n static isHandlingMimeForPasting(mime) {\n return false;\n }\n\n /**\n * Extract the data from the clipboard item and delegate the creation of the\n * editor to the parent.\n * @param {DataTransferItem} item\n * @param {AnnotationEditorLayer} parent\n */\n static paste(item, parent) {\n unreachable(\"Not implemented\");\n }\n\n /**\n * Get the properties to update in the UI for this editor.\n * @returns {Array}\n */\n get propertiesToUpdate() {\n return [];\n }\n\n get _isDraggable() {\n return this.#isDraggable;\n }\n\n set _isDraggable(value) {\n this.#isDraggable = value;\n this.div?.classList.toggle(\"draggable\", value);\n }\n\n get uid() {\n return this.annotationElementId || this.id;\n }\n\n /**\n * @returns {boolean} true if the editor handles the Enter key itself.\n */\n get isEnterHandled() {\n return true;\n }\n\n center() {\n const [pageWidth, pageHeight] = this.pageDimensions;\n switch (this.parentRotation) {\n case 90:\n this.x -= (this.height * pageHeight) / (pageWidth * 2);\n this.y += (this.width * pageWidth) / (pageHeight * 2);\n break;\n case 180:\n this.x += this.width / 2;\n this.y += this.height / 2;\n break;\n case 270:\n this.x += (this.height * pageHeight) / (pageWidth * 2);\n this.y -= (this.width * pageWidth) / (pageHeight * 2);\n break;\n default:\n this.x -= this.width / 2;\n this.y -= this.height / 2;\n break;\n }\n this.fixAndSetPosition();\n }\n\n /**\n * Add some commands into the CommandManager (undo/redo stuff).\n * @param {Object} params\n */\n addCommands(params) {\n this._uiManager.addCommands(params);\n }\n\n get currentLayer() {\n return this._uiManager.currentLayer;\n }\n\n /**\n * This editor will be behind the others.\n */\n setInBackground() {\n this.div.style.zIndex = 0;\n }\n\n /**\n * This editor will be in the foreground.\n */\n setInForeground() {\n this.div.style.zIndex = this.#zIndex;\n }\n\n setParent(parent) {\n if (parent !== null) {\n this.pageIndex = parent.pageIndex;\n this.pageDimensions = parent.pageDimensions;\n } else {\n // The editor is being removed from the DOM, so we need to stop resizing.\n this.#stopResizing();\n\n // Remove the fake annotation in the annotation layer.\n this.#fakeAnnotation?.remove();\n this.#fakeAnnotation = null;\n }\n this.parent = parent;\n }\n\n /**\n * onfocus callback.\n */\n focusin(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n if (!this.#hasBeenClicked) {\n this.parent.setSelected(this);\n } else {\n this.#hasBeenClicked = false;\n }\n }\n\n /**\n * onblur callback.\n * @param {FocusEvent} event\n */\n focusout(event) {\n if (!this._focusEventsAllowed) {\n return;\n }\n\n if (!this.isAttachedToDOM) {\n return;\n }\n\n // In case of focusout, the relatedTarget is the element which\n // is grabbing the focus.\n // So if the related target is an element under the div for this\n // editor, then the editor isn't unactive.\n const target = event.relatedTarget;\n if (target?.closest(`#${this.id}`)) {\n return;\n }\n\n event.preventDefault();\n\n if (!this.parent?.isMultipleSelection) {\n this.commitOrRemove();\n }\n }\n\n commitOrRemove() {\n if (this.isEmpty()) {\n this.remove();\n } else {\n this.commit();\n }\n }\n\n /**\n * Commit the data contained in this editor.\n */\n commit() {\n if (!this.isInEditMode()) {\n return;\n }\n this.addToAnnotationStorage();\n }\n\n addToAnnotationStorage() {\n this._uiManager.addToAnnotationStorage(this);\n }\n\n /**\n * Set the editor position within its parent.\n * @param {number} x\n * @param {number} y\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n */\n setAt(x, y, tx, ty) {\n const [width, height] = this.parentDimensions;\n [tx, ty] = this.screenToPageTranslation(tx, ty);\n\n this.x = (x + tx) / width;\n this.y = (y + ty) / height;\n\n this.fixAndSetPosition();\n }\n\n _moveAfterPaste(baseX, baseY) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n this.setAt(\n baseX * parentWidth,\n baseY * parentHeight,\n this.width * parentWidth,\n this.height * parentHeight\n );\n this._onTranslated();\n }\n\n #translate([width, height], x, y) {\n [x, y] = this.screenToPageTranslation(x, y);\n\n this.x += x / width;\n this.y += y / height;\n\n this._onTranslating(this.x, this.y);\n\n this.fixAndSetPosition();\n }\n\n /**\n * Translate the editor position within its parent.\n * @param {number} x - x-translation in screen coordinates.\n * @param {number} y - y-translation in screen coordinates.\n */\n translate(x, y) {\n // We don't change the initial position because the move here hasn't been\n // done by the user.\n this.#translate(this.parentDimensions, x, y);\n }\n\n /**\n * Translate the editor position within its page and adjust the scroll\n * in order to have the editor in the view.\n * @param {number} x - x-translation in page coordinates.\n * @param {number} y - y-translation in page coordinates.\n */\n translateInPage(x, y) {\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n this.#translate(this.pageDimensions, x, y);\n this.div.scrollIntoView({ block: \"nearest\" });\n }\n\n translationDone() {\n this._onTranslated(this.x, this.y);\n }\n\n drag(tx, ty) {\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n const {\n div,\n parentDimensions: [parentWidth, parentHeight],\n } = this;\n this.x += tx / parentWidth;\n this.y += ty / parentHeight;\n if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {\n // It's possible to not have a parent: for example, when the user is\n // dragging all the selected editors but this one on a page which has been\n // destroyed.\n // It's why we need to check for it. In such a situation, it isn't really\n // a problem to not find a new parent: it's something which is related to\n // what the user is seeing, hence it depends on how pages are layed out.\n\n // The element will be outside of its parent so change the parent.\n const { x, y } = this.div.getBoundingClientRect();\n if (this.parent.findNewParent(this, x, y)) {\n this.x -= Math.floor(this.x);\n this.y -= Math.floor(this.y);\n }\n }\n\n // The editor can be moved wherever the user wants, so we don't need to fix\n // the position: it'll be done when the user will release the mouse button.\n\n let { x, y } = this;\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n const { style } = div;\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n\n this._onTranslating(x, y);\n\n div.scrollIntoView({ block: \"nearest\" });\n }\n\n /**\n * Called when the editor is being translated.\n * @param {number} x - in page coordinates.\n * @param {number} y - in page coordinates.\n */\n _onTranslating(x, y) {}\n\n /**\n * Called when the editor has been translated.\n * @param {number} x - in page coordinates.\n * @param {number} y - in page coordinates.\n */\n _onTranslated(x, y) {}\n\n get _hasBeenMoved() {\n return (\n !!this.#initialRect &&\n (this.#initialRect[0] !== this.x || this.#initialRect[1] !== this.y)\n );\n }\n\n get _hasBeenResized() {\n return (\n !!this.#initialRect &&\n (this.#initialRect[2] !== this.width ||\n this.#initialRect[3] !== this.height)\n );\n }\n\n /**\n * Get the translation to take into account the editor border.\n * The CSS engine positions the element by taking the border into account so\n * we must apply the opposite translation to have the editor in the right\n * position.\n * @returns {Array}\n */\n getBaseTranslation() {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const { _borderLineWidth } = AnnotationEditor;\n const x = _borderLineWidth / parentWidth;\n const y = _borderLineWidth / parentHeight;\n switch (this.rotation) {\n case 90:\n return [-x, y];\n case 180:\n return [x, y];\n case 270:\n return [x, -y];\n default:\n return [-x, -y];\n }\n }\n\n /**\n * @returns {boolean} true if position must be fixed (i.e. make the x and y\n * living in the page).\n */\n get _mustFixPosition() {\n return true;\n }\n\n /**\n * Fix the position of the editor in order to keep it inside its parent page.\n * @param {number} [rotation] - the rotation of the page.\n */\n fixAndSetPosition(rotation = this.rotation) {\n const {\n div: { style },\n pageDimensions: [pageWidth, pageHeight],\n } = this;\n let { x, y, width, height } = this;\n width *= pageWidth;\n height *= pageHeight;\n x *= pageWidth;\n y *= pageHeight;\n\n if (this._mustFixPosition) {\n switch (rotation) {\n case 0:\n x = MathClamp(x, 0, pageWidth - width);\n y = MathClamp(y, 0, pageHeight - height);\n break;\n case 90:\n x = MathClamp(x, 0, pageWidth - height);\n y = MathClamp(y, width, pageHeight);\n break;\n case 180:\n x = MathClamp(x, width, pageWidth);\n y = MathClamp(y, height, pageHeight);\n break;\n case 270:\n x = MathClamp(x, height, pageWidth);\n y = MathClamp(y, 0, pageHeight - width);\n break;\n }\n }\n\n this.x = x /= pageWidth;\n this.y = y /= pageHeight;\n\n const [bx, by] = this.getBaseTranslation();\n x += bx;\n y += by;\n\n style.left = `${(100 * x).toFixed(2)}%`;\n style.top = `${(100 * y).toFixed(2)}%`;\n\n this.moveInDOM();\n }\n\n static #rotatePoint(x, y, angle) {\n switch (angle) {\n case 90:\n return [y, -x];\n case 180:\n return [-x, -y];\n case 270:\n return [-y, x];\n default:\n return [x, y];\n }\n }\n\n /**\n * Convert a screen translation into a page one.\n * @param {number} x\n * @param {number} y\n */\n screenToPageTranslation(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, this.parentRotation);\n }\n\n /**\n * Convert a page translation into a screen one.\n * @param {number} x\n * @param {number} y\n */\n pageTranslationToScreen(x, y) {\n return AnnotationEditor.#rotatePoint(x, y, 360 - this.parentRotation);\n }\n\n #getRotationMatrix(rotation) {\n switch (rotation) {\n case 90: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];\n }\n case 180:\n return [-1, 0, 0, -1];\n case 270: {\n const [pageWidth, pageHeight] = this.pageDimensions;\n return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];\n }\n default:\n return [1, 0, 0, 1];\n }\n }\n\n get parentScale() {\n return this._uiManager.viewParameters.realScale;\n }\n\n get parentRotation() {\n return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;\n }\n\n get parentDimensions() {\n const {\n parentScale,\n pageDimensions: [pageWidth, pageHeight],\n } = this;\n return [pageWidth * parentScale, pageHeight * parentScale];\n }\n\n /**\n * Set the dimensions of this editor.\n */\n setDims() {\n const {\n div: { style },\n width,\n height,\n } = this;\n style.width = `${(100 * width).toFixed(2)}%`;\n style.height = `${(100 * height).toFixed(2)}%`;\n }\n\n /**\n * Get the translation used to position this editor when it's created.\n * @returns {Array}\n */\n getInitialTranslation() {\n return [0, 0];\n }\n\n #createResizers() {\n if (this.#resizersDiv) {\n return;\n }\n this.#resizersDiv = document.createElement(\"div\");\n this.#resizersDiv.classList.add(\"resizers\");\n // When the resizers are used with the keyboard, they're focusable, hence\n // we want to have them in this order (top left, top middle, top right, ...)\n // in the DOM to have the focus order correct.\n const classes = this._willKeepAspectRatio\n ? [\"topLeft\", \"topRight\", \"bottomRight\", \"bottomLeft\"]\n : [\n \"topLeft\",\n \"topMiddle\",\n \"topRight\",\n \"middleRight\",\n \"bottomRight\",\n \"bottomMiddle\",\n \"bottomLeft\",\n \"middleLeft\",\n ];\n const signal = this._uiManager._signal;\n for (const name of classes) {\n const div = document.createElement(\"div\");\n this.#resizersDiv.append(div);\n div.classList.add(\"resizer\", name);\n div.setAttribute(\"data-resizer-name\", name);\n div.addEventListener(\n \"pointerdown\",\n this.#resizerPointerdown.bind(this, name),\n { signal }\n );\n div.addEventListener(\"contextmenu\", noContextMenu, { signal });\n div.tabIndex = -1;\n }\n this.div.prepend(this.#resizersDiv);\n }\n\n #resizerPointerdown(name, event) {\n event.preventDefault();\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n return;\n }\n\n this.#altText?.toggle(false);\n\n const savedDraggable = this._isDraggable;\n this._isDraggable = false;\n this.#lastPointerCoords = [event.screenX, event.screenY];\n\n const ac = new AbortController();\n const signal = this._uiManager.combinedSignal(ac);\n\n this.parent.togglePointerEvents(false);\n window.addEventListener(\n \"pointermove\",\n this.#resizerPointermove.bind(this, name),\n { passive: true, capture: true, signal }\n );\n window.addEventListener(\n \"touchmove\",\n stopEvent /* Prevent the page from scrolling */,\n { passive: false, signal }\n );\n window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n const savedParentCursor = this.parent.div.style.cursor;\n const savedCursor = this.div.style.cursor;\n this.div.style.cursor = this.parent.div.style.cursor =\n window.getComputedStyle(event.target).cursor;\n\n const pointerUpCallback = () => {\n ac.abort();\n this.parent.togglePointerEvents(true);\n this.#altText?.toggle(true);\n this._isDraggable = savedDraggable;\n this.parent.div.style.cursor = savedParentCursor;\n this.div.style.cursor = savedCursor;\n\n this.#addResizeToUndoStack();\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user switches to another window (with alt+tab), then we end the\n // resize session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n #resize(x, y, width, height) {\n this.width = width;\n this.height = height;\n this.x = x;\n this.y = y;\n this.setDims();\n this.fixAndSetPosition();\n this._onResized();\n }\n\n /**\n * Called when the editor has been resized.\n */\n _onResized() {}\n\n #addResizeToUndoStack() {\n if (!this.#savedDimensions) {\n return;\n }\n const { savedX, savedY, savedWidth, savedHeight } = this.#savedDimensions;\n this.#savedDimensions = null;\n\n const newX = this.x;\n const newY = this.y;\n const newWidth = this.width;\n const newHeight = this.height;\n if (\n newX === savedX &&\n newY === savedY &&\n newWidth === savedWidth &&\n newHeight === savedHeight\n ) {\n return;\n }\n\n this.addCommands({\n cmd: this.#resize.bind(this, newX, newY, newWidth, newHeight),\n undo: this.#resize.bind(this, savedX, savedY, savedWidth, savedHeight),\n mustExec: true,\n });\n }\n\n static _round(x) {\n // 10000 because we multiply by 100 and use toFixed(2) in fixAndSetPosition.\n // Without rounding, the positions of the corners other than the top left\n // one can be slightly wrong.\n return Math.round(x * 10000) / 10000;\n }\n\n #resizerPointermove(name, event) {\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [\n rotationMatrix[0] * x + rotationMatrix[2] * y,\n rotationMatrix[1] * x + rotationMatrix[3] * y,\n ];\n const invRotationMatrix = this.#getRotationMatrix(360 - this.rotation);\n const invTransf = (x, y) => [\n invRotationMatrix[0] * x + invRotationMatrix[2] * y,\n invRotationMatrix[1] * x + invRotationMatrix[3] * y,\n ];\n let getPoint;\n let getOpposite;\n let isDiagonal = false;\n let isHorizontal = false;\n\n switch (name) {\n case \"topLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, 0];\n getOpposite = (w, h) => [w, h];\n break;\n case \"topMiddle\":\n getPoint = (w, h) => [w / 2, 0];\n getOpposite = (w, h) => [w / 2, h];\n break;\n case \"topRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, 0];\n getOpposite = (w, h) => [0, h];\n break;\n case \"middleRight\":\n isHorizontal = true;\n getPoint = (w, h) => [w, h / 2];\n getOpposite = (w, h) => [0, h / 2];\n break;\n case \"bottomRight\":\n isDiagonal = true;\n getPoint = (w, h) => [w, h];\n getOpposite = (w, h) => [0, 0];\n break;\n case \"bottomMiddle\":\n getPoint = (w, h) => [w / 2, h];\n getOpposite = (w, h) => [w / 2, 0];\n break;\n case \"bottomLeft\":\n isDiagonal = true;\n getPoint = (w, h) => [0, h];\n getOpposite = (w, h) => [w, 0];\n break;\n case \"middleLeft\":\n isHorizontal = true;\n getPoint = (w, h) => [0, h / 2];\n getOpposite = (w, h) => [w, h / 2];\n break;\n }\n\n const point = getPoint(savedWidth, savedHeight);\n const oppositePoint = getOpposite(savedWidth, savedHeight);\n let transfOppositePoint = transf(...oppositePoint);\n const oppositeX = AnnotationEditor._round(savedX + transfOppositePoint[0]);\n const oppositeY = AnnotationEditor._round(savedY + transfOppositePoint[1]);\n let ratioX = 1;\n let ratioY = 1;\n\n let deltaX, deltaY;\n\n if (!event.fromKeyboard) {\n // We can't use event.movementX/Y because they're not reliable:\n // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/movementX\n // (it was buggy on a laptop with a touch screen).\n const { screenX, screenY } = event;\n const [lastScreenX, lastScreenY] = this.#lastPointerCoords;\n [deltaX, deltaY] = this.screenToPageTranslation(\n screenX - lastScreenX,\n screenY - lastScreenY\n );\n this.#lastPointerCoords[0] = screenX;\n this.#lastPointerCoords[1] = screenY;\n } else {\n ({ deltaX, deltaY } = event);\n }\n [deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);\n\n if (isDiagonal) {\n const oldDiag = Math.hypot(savedWidth, savedHeight);\n ratioX = ratioY = Math.max(\n Math.min(\n Math.hypot(\n oppositePoint[0] - point[0] - deltaX,\n oppositePoint[1] - point[1] - deltaY\n ) / oldDiag,\n // Avoid the editor to be larger than the page.\n 1 / savedWidth,\n 1 / savedHeight\n ),\n // Avoid the editor to be smaller than the minimum size.\n minWidth / savedWidth,\n minHeight / savedHeight\n );\n } else if (isHorizontal) {\n ratioX =\n MathClamp(Math.abs(oppositePoint[0] - point[0] - deltaX), minWidth, 1) /\n savedWidth;\n } else {\n ratioY =\n MathClamp(\n Math.abs(oppositePoint[1] - point[1] - deltaY),\n minHeight,\n 1\n ) / savedHeight;\n }\n\n const newWidth = AnnotationEditor._round(savedWidth * ratioX);\n const newHeight = AnnotationEditor._round(savedHeight * ratioY);\n transfOppositePoint = transf(...getOpposite(newWidth, newHeight));\n const newX = oppositeX - transfOppositePoint[0];\n const newY = oppositeY - transfOppositePoint[1];\n\n this.#initialRect ||= [this.x, this.y, this.width, this.height];\n this.width = newWidth;\n this.height = newHeight;\n this.x = newX;\n this.y = newY;\n\n this.setDims();\n this.fixAndSetPosition();\n\n this._onResizing();\n }\n\n /**\n * Called when the editor is being resized.\n */\n _onResizing() {}\n\n /**\n * Called when the alt text dialog is closed.\n */\n altTextFinish() {\n this.#altText?.finish();\n }\n\n /**\n * Get the toolbar buttons for this editor.\n * @returns {Array>|null}\n */\n get toolbarButtons() {\n return null;\n }\n\n /**\n * Add a toolbar for this editor.\n * @returns {Promise}\n */\n async addEditToolbar() {\n if (this._editToolbar || this.#isInEditMode) {\n return this._editToolbar;\n }\n this._editToolbar = new EditorToolbar(this);\n this.div.append(this._editToolbar.render());\n const { toolbarButtons } = this;\n if (toolbarButtons) {\n for (const [name, tool] of toolbarButtons) {\n await this._editToolbar.addButton(name, tool);\n }\n }\n if (!this.hasComment) {\n this._editToolbar.addButton(\"comment\", this.addCommentButton());\n }\n this._editToolbar.addButton(\"delete\");\n\n return this._editToolbar;\n }\n\n addCommentButtonInToolbar() {\n this._editToolbar?.addButtonBefore(\n \"comment\",\n this.addCommentButton(),\n \".deleteButton\"\n );\n }\n\n removeCommentButtonFromToolbar() {\n this._editToolbar?.removeButton(\"comment\");\n }\n\n removeEditToolbar() {\n this._editToolbar?.remove();\n this._editToolbar = null;\n\n // We destroy the alt text but we don't null it because we want to be able\n // to restore it in case the user undoes the deletion.\n this.#altText?.destroy();\n }\n\n addContainer(container) {\n const editToolbarDiv = this._editToolbar?.div;\n if (editToolbarDiv) {\n editToolbarDiv.before(container);\n } else {\n this.div.append(container);\n }\n }\n\n getClientDimensions() {\n return this.div.getBoundingClientRect();\n }\n\n /**\n * Create the alt text for this editor.\n * @returns {object}\n */\n createAltText() {\n if (!this.#altText) {\n AltText.initialize(AnnotationEditor._l10n);\n this.#altText = new AltText(this);\n if (this.#accessibilityData) {\n this.#altText.data = this.#accessibilityData;\n this.#accessibilityData = null;\n }\n }\n return this.#altText;\n }\n\n get altTextData() {\n return this.#altText?.data;\n }\n\n /**\n * Set the alt text data.\n */\n set altTextData(data) {\n if (!this.#altText) {\n return;\n }\n this.#altText.data = data;\n }\n\n get guessedAltText() {\n return this.#altText?.guessedText;\n }\n\n async setGuessedAltText(text) {\n await this.#altText?.setGuessedText(text);\n }\n\n serializeAltText(isForCopying) {\n return this.#altText?.serialize(isForCopying);\n }\n\n hasAltText() {\n return !!this.#altText && !this.#altText.isEmpty();\n }\n\n hasAltTextData() {\n return this.#altText?.hasData() ?? false;\n }\n\n focusCommentButton() {\n this.#comment?.focusButton();\n }\n\n addCommentButton() {\n return (this.#comment ||= new Comment(this));\n }\n\n addStandaloneCommentButton() {\n if (this.#commentStandaloneButton) {\n if (this._uiManager.isEditingMode()) {\n this.#commentStandaloneButton.classList.remove(\"hidden\");\n }\n return;\n }\n if (!this.hasComment) {\n return;\n }\n this.#commentStandaloneButton = this.#comment.renderForStandalone();\n this.div.append(this.#commentStandaloneButton);\n }\n\n removeStandaloneCommentButton() {\n this.#comment.removeStandaloneCommentButton();\n this.#commentStandaloneButton = null;\n }\n\n hideStandaloneCommentButton() {\n this.#commentStandaloneButton?.classList.add(\"hidden\");\n }\n\n get comment() {\n const {\n data: { richText, text, date, deleted },\n } = this.#comment;\n return {\n text,\n richText,\n date,\n deleted,\n color: this.getNonHCMColor(),\n opacity: this.opacity ?? 1,\n };\n }\n\n set comment(text) {\n this.#comment ||= new Comment(this);\n this.#comment.data = text;\n if (this.hasComment) {\n this.removeCommentButtonFromToolbar();\n this.addStandaloneCommentButton();\n this._uiManager.updateComment(this);\n } else {\n this.addCommentButtonInToolbar();\n this.removeStandaloneCommentButton();\n this._uiManager.removeComment(this);\n }\n }\n\n setCommentData({ comment, popupRef, richText }) {\n if (!popupRef) {\n return;\n }\n this.#comment ||= new Comment(this);\n this.#comment.setInitialText(comment, richText);\n\n if (!this.annotationElementId) {\n return;\n }\n const storedData = this._uiManager.getAndRemoveDataFromAnnotationStorage(\n this.annotationElementId\n );\n if (storedData) {\n this.updateFromAnnotationLayer(storedData);\n }\n }\n\n get hasEditedComment() {\n return this.#comment?.hasBeenEdited();\n }\n\n get hasDeletedComment() {\n return this.#comment?.isDeleted();\n }\n\n get hasComment() {\n return (\n !!this.#comment && !this.#comment.isEmpty() && !this.#comment.isDeleted()\n );\n }\n\n async editComment(options) {\n this.#comment ||= new Comment(this);\n this.#comment.edit(options);\n }\n\n toggleComment(isSelected, visibility = undefined) {\n if (this.hasComment) {\n this._uiManager.toggleComment(this, isSelected, visibility);\n }\n }\n\n setSelectedCommentButton(selected) {\n this.#comment.setSelectedButton(selected);\n }\n\n addComment(serialized) {\n if (this.hasEditedComment) {\n const DEFAULT_POPUP_WIDTH = 180;\n const DEFAULT_POPUP_HEIGHT = 100;\n const [, , , trY] = serialized.rect;\n const [pageWidth] = this.pageDimensions;\n const [pageX] = this.pageTranslation;\n const blX = pageX + pageWidth + 1;\n const blY = trY - DEFAULT_POPUP_HEIGHT;\n const trX = blX + DEFAULT_POPUP_WIDTH;\n serialized.popup = {\n contents: this.comment.text,\n deleted: this.comment.deleted,\n rect: [blX, blY, trX, trY],\n };\n }\n }\n\n updateFromAnnotationLayer({ popup: { contents, deleted } }) {\n this.#comment.data = deleted ? null : contents;\n }\n\n get parentBoundingClientRect() {\n return this.parent.boundingClientRect;\n }\n\n /**\n * Render this editor in a div.\n * @returns {HTMLDivElement | null}\n */\n render() {\n const div = (this.div = document.createElement(\"div\"));\n div.setAttribute(\"data-editor-rotation\", (360 - this.rotation) % 360);\n div.className = this.name;\n div.setAttribute(\"id\", this.id);\n div.tabIndex = this.#disabled ? -1 : 0;\n div.setAttribute(\"role\", \"application\");\n if (this.defaultL10nId) {\n div.setAttribute(\"data-l10n-id\", this.defaultL10nId);\n }\n if (!this._isVisible) {\n div.classList.add(\"hidden\");\n }\n\n this.setInForeground();\n this.#addFocusListeners();\n\n const [parentWidth, parentHeight] = this.parentDimensions;\n if (this.parentRotation % 180 !== 0) {\n div.style.maxWidth = `${((100 * parentHeight) / parentWidth).toFixed(\n 2\n )}%`;\n div.style.maxHeight = `${((100 * parentWidth) / parentHeight).toFixed(\n 2\n )}%`;\n }\n\n const [tx, ty] = this.getInitialTranslation();\n this.translate(tx, ty);\n\n bindEvents(this, div, [\"keydown\", \"pointerdown\", \"dblclick\"]);\n\n if (this.isResizable && this._uiManager._supportsPinchToZoom) {\n this.#touchManager ||= new TouchManager({\n container: div,\n isPinchingDisabled: () => !this.isSelected,\n onPinchStart: this.#touchPinchStartCallback.bind(this),\n onPinching: this.#touchPinchCallback.bind(this),\n onPinchEnd: this.#touchPinchEndCallback.bind(this),\n signal: this._uiManager._signal,\n });\n }\n\n this.addStandaloneCommentButton();\n this._uiManager._editorUndoBar?.hide();\n\n return div;\n }\n\n #touchPinchStartCallback() {\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n this.#altText?.toggle(false);\n this.parent.togglePointerEvents(false);\n }\n\n #touchPinchCallback(_origin, prevDistance, distance) {\n // Slightly slow down the zooming because the editor could be small and the\n // user could have difficulties to rescale it as they want.\n const slowDownFactor = 0.7;\n let factor =\n slowDownFactor * (distance / prevDistance) + 1 - slowDownFactor;\n if (factor === 1) {\n return;\n }\n\n const rotationMatrix = this.#getRotationMatrix(this.rotation);\n const transf = (x, y) => [\n rotationMatrix[0] * x + rotationMatrix[2] * y,\n rotationMatrix[1] * x + rotationMatrix[3] * y,\n ];\n\n // The center of the editor is the fixed point.\n const [parentWidth, parentHeight] = this.parentDimensions;\n const savedX = this.x;\n const savedY = this.y;\n const savedWidth = this.width;\n const savedHeight = this.height;\n\n const minWidth = AnnotationEditor.MIN_SIZE / parentWidth;\n const minHeight = AnnotationEditor.MIN_SIZE / parentHeight;\n factor = Math.max(\n Math.min(factor, 1 / savedWidth, 1 / savedHeight),\n minWidth / savedWidth,\n minHeight / savedHeight\n );\n const newWidth = AnnotationEditor._round(savedWidth * factor);\n const newHeight = AnnotationEditor._round(savedHeight * factor);\n if (newWidth === savedWidth && newHeight === savedHeight) {\n return;\n }\n\n this.#initialRect ||= [savedX, savedY, savedWidth, savedHeight];\n const transfCenterPoint = transf(savedWidth / 2, savedHeight / 2);\n const centerX = AnnotationEditor._round(savedX + transfCenterPoint[0]);\n const centerY = AnnotationEditor._round(savedY + transfCenterPoint[1]);\n const newTransfCenterPoint = transf(newWidth / 2, newHeight / 2);\n\n this.x = centerX - newTransfCenterPoint[0];\n this.y = centerY - newTransfCenterPoint[1];\n this.width = newWidth;\n this.height = newHeight;\n\n this.setDims();\n this.fixAndSetPosition();\n\n this._onResizing();\n }\n\n #touchPinchEndCallback() {\n this.#altText?.toggle(true);\n this.parent.togglePointerEvents(true);\n this.#addResizeToUndoStack();\n }\n\n /**\n * Onpointerdown callback.\n * @param {PointerEvent} event\n */\n pointerdown(event) {\n const { isMac } = FeatureTest.platform;\n if (event.button !== 0 || (event.ctrlKey && isMac)) {\n // Avoid to focus this editor because of a non-left click.\n event.preventDefault();\n return;\n }\n this.#hasBeenClicked = true;\n\n if (this._isDraggable) {\n this.#setUpDragSession(event);\n return;\n }\n\n this.#selectOnPointerEvent(event);\n }\n\n #selectOnPointerEvent(event) {\n const { isMac } = FeatureTest.platform;\n if (\n (event.ctrlKey && !isMac) ||\n event.shiftKey ||\n (event.metaKey && isMac)\n ) {\n this.parent.toggleSelected(this);\n } else {\n this.parent.setSelected(this);\n }\n }\n\n #setUpDragSession(event) {\n const { isSelected } = this;\n this._uiManager.setUpDragSession();\n let hasDraggingStarted = false;\n\n const ac = new AbortController();\n const signal = this._uiManager.combinedSignal(ac);\n const opts = { capture: true, passive: false, signal };\n const cancelDrag = e => {\n ac.abort();\n\n this.#dragPointerId = null;\n this.#hasBeenClicked = false;\n if (!this._uiManager.endDragSession()) {\n this.#selectOnPointerEvent(e);\n }\n if (hasDraggingStarted) {\n this._onStopDragging();\n }\n };\n\n if (isSelected) {\n this.#prevDragX = event.clientX;\n this.#prevDragY = event.clientY;\n this.#dragPointerId = event.pointerId;\n this.#dragPointerType = event.pointerType;\n window.addEventListener(\n \"pointermove\",\n e => {\n if (!hasDraggingStarted) {\n hasDraggingStarted = true;\n this._uiManager.toggleComment(\n this,\n /* isSelected = */ true,\n /* visibility = */ false\n );\n this._onStartDragging();\n }\n const { clientX: x, clientY: y, pointerId } = e;\n if (pointerId !== this.#dragPointerId) {\n stopEvent(e);\n return;\n }\n const [tx, ty] = this.screenToPageTranslation(\n x - this.#prevDragX,\n y - this.#prevDragY\n );\n this.#prevDragX = x;\n this.#prevDragY = y;\n this._uiManager.dragSelectedEditors(tx, ty);\n },\n opts\n );\n window.addEventListener(\n \"touchmove\",\n stopEvent /* Prevent the page from scrolling */,\n opts\n );\n window.addEventListener(\n \"pointerdown\",\n // If the user drags with one finger and then clicks with another.\n e => {\n if (e.pointerType === this.#dragPointerType) {\n // We've a pinch to zoom session.\n // We cannot have two primaries at the same time.\n // It's possible to be in this state with Firefox and Gnome when\n // trying to drag with three fingers (see bug 1933716).\n if (this.#touchManager || e.isPrimary) {\n cancelDrag(e);\n }\n }\n stopEvent(e);\n },\n opts\n );\n }\n\n const pointerUpCallback = e => {\n if (!this.#dragPointerId || this.#dragPointerId === e.pointerId) {\n cancelDrag(e);\n return;\n }\n stopEvent(e);\n };\n window.addEventListener(\"pointerup\", pointerUpCallback, { signal });\n // If the user is using alt+tab during the dragging session, the pointerup\n // event could be not fired, but a blur event is fired so we can use it in\n // order to interrupt the dragging session.\n window.addEventListener(\"blur\", pointerUpCallback, { signal });\n }\n\n _onStartDragging() {}\n\n _onStopDragging() {}\n\n moveInDOM() {\n // Moving the editor in the DOM can be expensive, so we wait a bit before.\n // It's important to not block the UI (for example when changing the font\n // size in a FreeText).\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n }\n this.#moveInDOMTimeout = setTimeout(() => {\n this.#moveInDOMTimeout = null;\n this.parent?.moveEditorInDOM(this);\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n this._uiManager._eventBus.dispatch(\"editormovedindom\", {\n source: this,\n });\n }\n }, 0);\n }\n\n _setParentAndPosition(parent, x, y) {\n parent.changeParent(this);\n this.x = x;\n this.y = y;\n this.fixAndSetPosition();\n this._onTranslated();\n }\n\n /**\n * Convert the current rect into a page one.\n * @param {number} tx - x-translation in screen coordinates.\n * @param {number} ty - y-translation in screen coordinates.\n * @param {number} [rotation] - the rotation of the page.\n */\n getRect(tx, ty, rotation = this.rotation) {\n const scale = this.parentScale;\n const [pageWidth, pageHeight] = this.pageDimensions;\n const [pageX, pageY] = this.pageTranslation;\n const shiftX = tx / scale;\n const shiftY = ty / scale;\n const x = this.x * pageWidth;\n const y = this.y * pageHeight;\n const width = this.width * pageWidth;\n const height = this.height * pageHeight;\n\n switch (rotation) {\n case 0:\n return [\n x + shiftX + pageX,\n pageHeight - y - shiftY - height + pageY,\n x + shiftX + width + pageX,\n pageHeight - y - shiftY + pageY,\n ];\n case 90:\n return [\n x + shiftY + pageX,\n pageHeight - y + shiftX + pageY,\n x + shiftY + height + pageX,\n pageHeight - y + shiftX + width + pageY,\n ];\n case 180:\n return [\n x - shiftX - width + pageX,\n pageHeight - y + shiftY + pageY,\n x - shiftX + pageX,\n pageHeight - y + shiftY + height + pageY,\n ];\n case 270:\n return [\n x - shiftY - height + pageX,\n pageHeight - y - shiftX - width + pageY,\n x - shiftY + pageX,\n pageHeight - y - shiftX + pageY,\n ];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n getRectInCurrentCoords(rect, pageHeight) {\n const [x1, y1, x2, y2] = rect;\n\n const width = x2 - x1;\n const height = y2 - y1;\n\n switch (this.rotation) {\n case 0:\n return [x1, pageHeight - y2, width, height];\n case 90:\n return [x1, pageHeight - y1, height, width];\n case 180:\n return [x2, pageHeight - y1, width, height];\n case 270:\n return [x2, pageHeight - y2, height, width];\n default:\n throw new Error(\"Invalid rotation\");\n }\n }\n\n /**\n * Get the rect in page coordinates without any translation.\n * It's used when serializing the editor.\n * @returns {Array}\n */\n getPDFRect() {\n return this.getRect(0, 0);\n }\n\n getNonHCMColor() {\n return (\n this.color &&\n AnnotationEditor._colorManager.convert(\n this._uiManager.getNonHCMColor(this.color)\n )\n );\n }\n\n /**\n * The color has been changed.\n */\n onUpdatedColor() {\n this.#comment?.onUpdatedColor();\n }\n\n getData() {\n const {\n comment: { text: str, color, date, opacity, deleted, richText },\n uid: id,\n pageIndex,\n creationDate,\n modificationDate,\n } = this;\n return {\n id,\n pageIndex,\n rect: this.getPDFRect(),\n richText,\n contentsObj: { str },\n creationDate,\n modificationDate: date || modificationDate,\n popupRef: !deleted,\n color,\n opacity,\n };\n }\n\n /**\n * Executed once this editor has been rendered.\n * @param {boolean} focus - true if the editor should be focused.\n */\n onceAdded(focus) {}\n\n /**\n * Check if the editor contains something.\n * @returns {boolean}\n */\n isEmpty() {\n return false;\n }\n\n /**\n * Enable edit mode.\n * @returns {boolean} - true if the edit mode has been enabled.\n */\n enableEditMode() {\n if (this.isInEditMode()) {\n return false;\n }\n this.parent.setEditingState(false);\n this.#isInEditMode = true;\n\n return true;\n }\n\n /**\n * Disable edit mode.\n * @returns {boolean} - true if the edit mode has been disabled.\n */\n disableEditMode() {\n if (!this.isInEditMode()) {\n return false;\n }\n this.parent.setEditingState(true);\n this.#isInEditMode = false;\n\n return true;\n }\n\n /**\n * Check if the editor is edited.\n * @returns {boolean}\n */\n isInEditMode() {\n return this.#isInEditMode;\n }\n\n /**\n * If it returns true, then this editor handles the keyboard\n * events itself.\n * @returns {boolean}\n */\n shouldGetKeyboardEvents() {\n return this.#isResizerEnabledForKeyboard;\n }\n\n /**\n * Check if this editor needs to be rebuilt or not.\n * @returns {boolean}\n */\n needsToBeRebuilt() {\n return this.div && !this.isAttachedToDOM;\n }\n\n get isOnScreen() {\n const { top, left, bottom, right } = this.getClientDimensions();\n const { innerHeight, innerWidth } = window;\n return left < innerWidth && right > 0 && top < innerHeight && bottom > 0;\n }\n\n #addFocusListeners() {\n if (this.#focusAC || !this.div) {\n return;\n }\n this.#focusAC = new AbortController();\n const signal = this._uiManager.combinedSignal(this.#focusAC);\n\n this.div.addEventListener(\"focusin\", this.focusin.bind(this), { signal });\n this.div.addEventListener(\"focusout\", this.focusout.bind(this), { signal });\n }\n\n /**\n * Rebuild the editor in case it has been removed on undo.\n *\n * To implement in subclasses.\n */\n rebuild() {\n this.#addFocusListeners();\n }\n\n /**\n * Rotate the editor when the page is rotated.\n * @param {number} angle\n */\n rotate(_angle) {}\n\n /**\n * Resize the editor when the page is resized.\n */\n resize() {}\n\n /**\n * Serialize the editor when it has been deleted.\n * @returns {Object}\n */\n serializeDeleted() {\n return {\n id: this.annotationElementId,\n deleted: true,\n pageIndex: this.pageIndex,\n popupRef: this._initialData?.popupRef || \"\",\n };\n }\n\n /**\n * Serialize the editor.\n * The result of the serialization will be used to construct a\n * new annotation to add to the pdf document.\n *\n * To implement in subclasses.\n * @param {boolean} [isForCopying]\n * @param {Object | null} [context]\n * @returns {Object | null}\n */\n serialize(isForCopying = false, context = null) {\n return {\n annotationType: this.mode,\n pageIndex: this.pageIndex,\n rect: this.getPDFRect(),\n rotation: this.rotation,\n structTreeParentId: this._structTreeParentId,\n popupRef: this._initialData?.popupRef || \"\",\n };\n }\n\n /**\n * Deserialize the editor.\n * The result of the deserialization is a new editor.\n *\n * @param {Object} data\n * @param {AnnotationEditorLayer} parent\n * @param {AnnotationEditorUIManager} uiManager\n * @returns {Promise}\n */\n static async deserialize(data, parent, uiManager) {\n const editor = new this.prototype.constructor({\n parent,\n id: parent.getNextId(),\n uiManager,\n annotationElementId: data.annotationElementId,\n creationDate: data.creationDate,\n modificationDate: data.modificationDate,\n });\n editor.rotation = data.rotation;\n editor.#accessibilityData = data.accessibilityData;\n editor._isCopy = data.isCopy || false;\n\n const [pageWidth, pageHeight] = editor.pageDimensions;\n const [x, y, width, height] = editor.getRectInCurrentCoords(\n data.rect,\n pageHeight\n );\n\n editor.x = x / pageWidth;\n editor.y = y / pageHeight;\n editor.width = width / pageWidth;\n editor.height = height / pageHeight;\n\n return editor;\n }\n\n /**\n * Check if an existing annotation associated with this editor has been\n * modified.\n * @returns {boolean}\n */\n get hasBeenModified() {\n return (\n !!this.annotationElementId && (this.deleted || this.serialize() !== null)\n );\n }\n\n /**\n * Remove this editor.\n * It's used on ctrl+backspace action.\n */\n remove() {\n this.#focusAC?.abort();\n this.#focusAC = null;\n\n if (!this.isEmpty()) {\n // The editor is removed but it can be back at some point thanks to\n // undo/redo so we must commit it before.\n this.commit();\n }\n if (this.parent) {\n this.parent.remove(this);\n } else {\n this._uiManager.removeEditor(this);\n }\n\n if (this.#moveInDOMTimeout) {\n clearTimeout(this.#moveInDOMTimeout);\n this.#moveInDOMTimeout = null;\n }\n this.#stopResizing();\n this.removeEditToolbar();\n if (this.#telemetryTimeouts) {\n for (const timeout of this.#telemetryTimeouts.values()) {\n clearTimeout(timeout);\n }\n this.#telemetryTimeouts = null;\n }\n this.parent = null;\n this.#touchManager?.destroy();\n this.#touchManager = null;\n }\n\n /**\n * @returns {boolean} true if this editor can be resized.\n */\n get isResizable() {\n return false;\n }\n\n /**\n * Add the resizers to this editor.\n */\n makeResizable() {\n if (this.isResizable) {\n this.#createResizers();\n this.#resizersDiv.classList.remove(\"hidden\");\n }\n }\n\n get toolbarPosition() {\n return null;\n }\n\n /**\n * Get the position of the comment button.\n * @returns {Array|null}\n */\n get commentButtonPosition() {\n return this._uiManager.direction === \"ltr\" ? [1, 0] : [0, 0];\n }\n\n get commentButtonPositionInPage() {\n const {\n commentButtonPosition: [posX, posY],\n } = this;\n const [blX, blY, trX, trY] = this.getPDFRect();\n return [\n AnnotationEditor._round(blX + (trX - blX) * posX),\n AnnotationEditor._round(blY + (trY - blY) * (1 - posY)),\n ];\n }\n\n get commentButtonColor() {\n return this._uiManager.makeCommentColor(\n this.getNonHCMColor(),\n this.opacity\n );\n }\n\n get commentPopupPosition() {\n return this.#comment.commentPopupPositionInLayer;\n }\n\n set commentPopupPosition(pos) {\n this.#comment.commentPopupPositionInLayer = pos;\n }\n\n hasDefaultPopupPosition() {\n return this.#comment.hasDefaultPopupPosition();\n }\n\n get commentButtonWidth() {\n return this.#comment.commentButtonWidth;\n }\n\n get elementBeforePopup() {\n return this.div;\n }\n\n setCommentButtonStates(options) {\n this.#comment.setCommentButtonStates(options);\n }\n\n /**\n * onkeydown callback.\n * @param {KeyboardEvent} event\n */\n keydown(event) {\n if (\n !this.isResizable ||\n event.target !== this.div ||\n event.key !== \"Enter\"\n ) {\n return;\n }\n this._uiManager.setSelected(this);\n this.#savedDimensions = {\n savedX: this.x,\n savedY: this.y,\n savedWidth: this.width,\n savedHeight: this.height,\n };\n const children = this.#resizersDiv.children;\n if (!this.#allResizerDivs) {\n this.#allResizerDivs = Array.from(children);\n const boundResizerKeydown = this.#resizerKeydown.bind(this);\n const boundResizerBlur = this.#resizerBlur.bind(this);\n const signal = this._uiManager._signal;\n for (const div of this.#allResizerDivs) {\n const name = div.getAttribute(\"data-resizer-name\");\n div.setAttribute(\"role\", \"spinbutton\");\n div.addEventListener(\"keydown\", boundResizerKeydown, { signal });\n div.addEventListener(\"blur\", boundResizerBlur, { signal });\n div.addEventListener(\"focus\", this.#resizerFocus.bind(this, name), {\n signal,\n });\n div.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n }\n }\n\n // We want to have the resizers in the visual order, so we move the first\n // (top-left) to the right place.\n const first = this.#allResizerDivs[0];\n let firstPosition = 0;\n for (const div of children) {\n if (div === first) {\n break;\n }\n firstPosition++;\n }\n const nextFirstPosition =\n (((360 - this.rotation + this.parentRotation) % 360) / 90) *\n (this.#allResizerDivs.length / 4);\n\n if (nextFirstPosition !== firstPosition) {\n // We need to reorder the resizers in the DOM in order to have the focus\n // on the top-left one.\n if (nextFirstPosition < firstPosition) {\n for (let i = 0; i < firstPosition - nextFirstPosition; i++) {\n this.#resizersDiv.append(this.#resizersDiv.firstChild);\n }\n } else if (nextFirstPosition > firstPosition) {\n for (let i = 0; i < nextFirstPosition - firstPosition; i++) {\n this.#resizersDiv.firstChild.before(this.#resizersDiv.lastChild);\n }\n }\n\n let i = 0;\n for (const child of children) {\n const div = this.#allResizerDivs[i++];\n const name = div.getAttribute(\"data-resizer-name\");\n child.setAttribute(\"data-l10n-id\", AnnotationEditor._l10nResizer[name]);\n }\n }\n\n this.#setResizerTabIndex(0);\n this.#isResizerEnabledForKeyboard = true;\n this.#resizersDiv.firstChild.focus({ focusVisible: true });\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n\n #resizerKeydown(event) {\n AnnotationEditor._resizerKeyboardManager.exec(this, event);\n }\n\n #resizerBlur(event) {\n if (\n this.#isResizerEnabledForKeyboard &&\n event.relatedTarget?.parentNode !== this.#resizersDiv\n ) {\n this.#stopResizing();\n }\n }\n\n #resizerFocus(name) {\n this.#focusedResizerName = this.#isResizerEnabledForKeyboard ? name : \"\";\n }\n\n #setResizerTabIndex(value) {\n if (!this.#allResizerDivs) {\n return;\n }\n for (const div of this.#allResizerDivs) {\n div.tabIndex = value;\n }\n }\n\n _resizeWithKeyboard(x, y) {\n if (!this.#isResizerEnabledForKeyboard) {\n return;\n }\n this.#resizerPointermove(this.#focusedResizerName, {\n deltaX: x,\n deltaY: y,\n fromKeyboard: true,\n });\n }\n\n #stopResizing() {\n this.#isResizerEnabledForKeyboard = false;\n this.#setResizerTabIndex(-1);\n this.#addResizeToUndoStack();\n }\n\n _stopResizingWithKeyboard() {\n this.#stopResizing();\n this.div.focus();\n }\n\n /**\n * Select this editor.\n */\n select() {\n if (this.isSelected && this._editToolbar) {\n this._editToolbar.show();\n return;\n }\n this.isSelected = true;\n this.makeResizable();\n this.div?.classList.add(\"selectedEditor\");\n if (!this._editToolbar) {\n this.addEditToolbar().then(() => {\n if (this.div?.classList.contains(\"selectedEditor\")) {\n // The editor can have been unselected while we were waiting for the\n // edit toolbar to be created, hence we want to be sure that this\n // editor is still selected.\n this._editToolbar?.show();\n }\n });\n return;\n }\n this._editToolbar?.show();\n this.#altText?.toggleAltTextBadge(false);\n }\n\n focus() {\n if (this.div && !this.div.contains(document.activeElement)) {\n setTimeout(() => this.div?.focus({ preventScroll: true }), 0);\n }\n }\n\n /**\n * Unselect this editor.\n */\n unselect() {\n if (!this.isSelected) {\n return;\n }\n this.isSelected = false;\n this.#resizersDiv?.classList.add(\"hidden\");\n this.div?.classList.remove(\"selectedEditor\");\n if (this.div?.contains(document.activeElement)) {\n // Don't use this.div.blur() because we don't know where the focus will\n // go.\n this._uiManager.currentLayer.div.focus({\n preventScroll: true,\n });\n }\n this._editToolbar?.hide();\n this.#altText?.toggleAltTextBadge(true);\n if (this.hasComment) {\n this._uiManager.toggleComment(\n this,\n /* isSelected = */ false,\n /* visibility = */ false\n );\n }\n }\n\n /**\n * Update some parameters which have been changed through the UI.\n * @param {number} type\n * @param {*} value\n */\n updateParams(type, value) {}\n\n /**\n * When the user disables the editing mode some editors can change some of\n * their properties.\n */\n disableEditing() {}\n\n /**\n * When the user enables the editing mode some editors can change some of\n * their properties.\n */\n enableEditing() {}\n\n /**\n * Check if the content of this editor can be changed.\n * For example, a FreeText editor can be changed (the user can change the\n * text), but a Stamp editor cannot.\n * @returns {boolean}\n */\n get canChangeContent() {\n return false;\n }\n\n /**\n * The editor is about to be edited.\n */\n enterInEditMode() {\n if (!this.canChangeContent) {\n return;\n }\n this.enableEditMode();\n this.div.focus();\n }\n\n /**\n * ondblclick callback.\n * @param {MouseEvent} event\n */\n dblclick(event) {\n if (event.target.nodeName === \"BUTTON\") {\n // Avoid entering in edit mode when clicking on the comment button.\n return;\n }\n this.enterInEditMode();\n this.parent.updateToolbar({\n mode: this.constructor._editorType,\n editId: this.id,\n });\n }\n\n /**\n * @returns {HTMLElement | null} the element requiring an alt text.\n */\n getElementForAltText() {\n return this.div;\n }\n\n /**\n * Get the div which really contains the displayed content.\n * @returns {HTMLDivElement | undefined}\n */\n get contentDiv() {\n return this.div;\n }\n\n /**\n * If true then the editor is currently edited.\n * @type {boolean}\n */\n get isEditing() {\n return this.#isEditing;\n }\n\n /**\n * When set to true, it means that this editor is currently edited.\n * @param {boolean} value\n */\n set isEditing(value) {\n this.#isEditing = value;\n if (!this.parent) {\n return;\n }\n if (value) {\n this.parent.setSelected(this);\n this.parent.setActiveEditor(this);\n } else {\n this.parent.setActiveEditor(null);\n }\n }\n\n static get MIN_SIZE() {\n return 16;\n }\n\n static canCreateNewEmptyEditor() {\n return true;\n }\n\n /**\n * Get the data to report to the telemetry when the editor is added.\n * @returns {Object}\n */\n get telemetryInitialData() {\n return { action: \"added\" };\n }\n\n /**\n * The telemetry data to use when saving/printing.\n * @returns {Object|null}\n */\n get telemetryFinalData() {\n return null;\n }\n\n _reportTelemetry(data, mustWait = false) {\n if (mustWait) {\n this.#telemetryTimeouts ||= new Map();\n const { action } = data;\n let timeout = this.#telemetryTimeouts.get(action);\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n this._reportTelemetry(data);\n this.#telemetryTimeouts.delete(action);\n if (this.#telemetryTimeouts.size === 0) {\n this.#telemetryTimeouts = null;\n }\n }, AnnotationEditor._telemetryTimeout);\n this.#telemetryTimeouts.set(action, timeout);\n return;\n }\n data.type ||= this.editorType;\n this._uiManager._eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data,\n },\n });\n }\n\n /**\n * Show or hide this editor.\n * @param {boolean|undefined} visible\n */\n show(visible = this._isVisible) {\n this.div.classList.toggle(\"hidden\", !visible);\n this._isVisible = visible;\n }\n\n enable() {\n if (this.div) {\n this.div.tabIndex = 0;\n }\n this.#disabled = false;\n }\n\n disable() {\n if (this.div) {\n this.div.tabIndex = -1;\n }\n this.#disabled = true;\n }\n\n updateFakeAnnotationElement(annotationLayer) {\n if (!this.#fakeAnnotation && !this.deleted) {\n this.#fakeAnnotation = annotationLayer.addFakeAnnotation(this);\n return;\n }\n if (this.deleted) {\n this.#fakeAnnotation.remove();\n this.#fakeAnnotation = null;\n return;\n }\n if (this.hasEditedComment || this._hasBeenMoved || this._hasBeenResized) {\n this.#fakeAnnotation.updateEdited({\n rect: this.getPDFRect(),\n popup: this.comment,\n });\n }\n }\n\n /**\n * Render an annotation in the annotation layer.\n * @param {Object} annotation\n * @returns {HTMLElement|null}\n */\n renderAnnotationElement(annotation) {\n if (this.deleted) {\n annotation.hide();\n return null;\n }\n let content = annotation.container.querySelector(\".annotationContent\");\n if (!content) {\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n annotation.container.prepend(content);\n } else if (content.nodeName === \"CANVAS\") {\n const canvas = content;\n content = document.createElement(\"div\");\n content.classList.add(\"annotationContent\", this.editorType);\n canvas.before(content);\n }\n\n return content;\n }\n\n resetAnnotationElement(annotation) {\n const { firstChild } = annotation.container;\n if (\n firstChild?.nodeName === \"DIV\" &&\n firstChild.classList.contains(\"annotationContent\")\n ) {\n firstChild.remove();\n }\n }\n}\n\n// This class is used to fake an editor which has been deleted.\nclass FakeEditor extends AnnotationEditor {\n constructor(params) {\n super(params);\n this.annotationElementId = params.annotationElementId;\n this.deleted = true;\n }\n\n serialize() {\n return this.serializeDeleted();\n }\n}\n\nexport { AnnotationEditor };\n","/* Copyright 2014 Opera Software ASA\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 * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.\n * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.\n */\n\nconst SEED = 0xc3d2e1f0;\n// Workaround for missing math precision in JS.\nconst MASK_HIGH = 0xffff0000;\nconst MASK_LOW = 0xffff;\n\nclass MurmurHash3_64 {\n constructor(seed) {\n this.h1 = seed ? seed & 0xffffffff : SEED;\n this.h2 = seed ? seed & 0xffffffff : SEED;\n }\n\n update(input) {\n let data, length;\n if (typeof input === \"string\") {\n data = new Uint8Array(input.length * 2);\n length = 0;\n for (let i = 0, ii = input.length; i < ii; i++) {\n const code = input.charCodeAt(i);\n if (code <= 0xff) {\n data[length++] = code;\n } else {\n data[length++] = code >>> 8;\n data[length++] = code & 0xff;\n }\n }\n } else if (ArrayBuffer.isView(input)) {\n data = input.slice();\n length = data.byteLength;\n } else {\n throw new Error(\"Invalid data format, must be a string or TypedArray.\");\n }\n\n const blockCounts = length >> 2;\n const tailLength = length - blockCounts * 4;\n // We don't care about endianness here.\n const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);\n let k1 = 0,\n k2 = 0;\n let h1 = this.h1,\n h2 = this.h2;\n const C1 = 0xcc9e2d51,\n C2 = 0x1b873593;\n const C1_LOW = C1 & MASK_LOW,\n C2_LOW = C2 & MASK_LOW;\n\n for (let i = 0; i < blockCounts; i++) {\n if (i & 1) {\n k1 = dataUint32[i];\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1 = h1 * 5 + 0xe6546b64;\n } else {\n k2 = dataUint32[i];\n k2 = ((k2 * C1) & MASK_HIGH) | ((k2 * C1_LOW) & MASK_LOW);\n k2 = (k2 << 15) | (k2 >>> 17);\n k2 = ((k2 * C2) & MASK_HIGH) | ((k2 * C2_LOW) & MASK_LOW);\n h2 ^= k2;\n h2 = (h2 << 13) | (h2 >>> 19);\n h2 = h2 * 5 + 0xe6546b64;\n }\n }\n\n k1 = 0;\n\n switch (tailLength) {\n case 3:\n k1 ^= data[blockCounts * 4 + 2] << 16;\n /* falls through */\n case 2:\n k1 ^= data[blockCounts * 4 + 1] << 8;\n /* falls through */\n case 1:\n k1 ^= data[blockCounts * 4];\n /* falls through */\n\n k1 = ((k1 * C1) & MASK_HIGH) | ((k1 * C1_LOW) & MASK_LOW);\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((k1 * C2) & MASK_HIGH) | ((k1 * C2_LOW) & MASK_LOW);\n if (blockCounts & 1) {\n h1 ^= k1;\n } else {\n h2 ^= k1;\n }\n }\n\n this.h1 = h1;\n this.h2 = h2;\n }\n\n hexdigest() {\n let h1 = this.h1,\n h2 = this.h2;\n\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0xed558ccd) & MASK_HIGH) | ((h1 * 0x8ccd) & MASK_LOW);\n h2 =\n ((h2 * 0xff51afd7) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xafd7ed55) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n h1 = ((h1 * 0x1a85ec53) & MASK_HIGH) | ((h1 * 0xec53) & MASK_LOW);\n h2 =\n ((h2 * 0xc4ceb9fe) & MASK_HIGH) |\n (((((h2 << 16) | (h1 >>> 16)) * 0xb9fe1a85) & MASK_HIGH) >>> 16);\n h1 ^= h2 >>> 1;\n\n return (\n (h1 >>> 0).toString(16).padStart(8, \"0\") +\n (h2 >>> 0).toString(16).padStart(8, \"0\")\n );\n }\n}\n\nexport { MurmurHash3_64 };\n","/* Copyright 2020 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\nimport { shadow, unreachable } from \"../shared/util.js\";\nimport { AnnotationEditor } from \"./editor/editor.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst SerializableEmpty = Object.freeze({\n map: null,\n hash: \"\",\n transfer: undefined,\n});\n\n/**\n * Key/value storage for annotation data in forms.\n */\nclass AnnotationStorage {\n #modified = false;\n\n #modifiedIds = null;\n\n #editorsMap = null;\n\n #storage = new Map();\n\n constructor() {\n // Callbacks to signal when the modification state is set or reset.\n // This is used by the viewer to only bind on `beforeunload` if forms\n // are actually edited to prevent doing so unconditionally since that\n // can have undesirable effects.\n this.onSetModified = null;\n this.onResetModified = null;\n this.onAnnotationEditor = null;\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"_setValues\", {\n value: obj => {\n for (const [key, val] of Object.entries(obj)) {\n this.setValue(key, val);\n }\n },\n });\n }\n }\n\n /**\n * Get the value for a given key if it exists, or return the default value.\n * @param {string} key\n * @param {Object} defaultValue\n * @returns {Object}\n */\n getValue(key, defaultValue) {\n const value = this.#storage.get(key);\n if (value === undefined) {\n return defaultValue;\n }\n\n return Object.assign(defaultValue, value);\n }\n\n /**\n * Get the value for a given key.\n * @param {string} key\n * @returns {Object}\n */\n getRawValue(key) {\n return this.#storage.get(key);\n }\n\n /**\n * Remove a value from the storage.\n * @param {string} key\n */\n remove(key) {\n const storedValue = this.#storage.get(key);\n if (storedValue === undefined) {\n return;\n }\n if (storedValue instanceof AnnotationEditor) {\n this.#editorsMap.delete(storedValue.annotationElementId);\n }\n this.#storage.delete(key);\n\n if (this.#storage.size === 0) {\n this.resetModified();\n }\n\n if (typeof this.onAnnotationEditor === \"function\") {\n for (const value of this.#storage.values()) {\n if (value instanceof AnnotationEditor) {\n return;\n }\n }\n this.onAnnotationEditor(null);\n }\n }\n\n /**\n * Set the value for a given key\n * @param {string} key\n * @param {Object} value\n */\n setValue(key, value) {\n const obj = this.#storage.get(key);\n let modified = false;\n if (obj !== undefined) {\n for (const [entry, val] of Object.entries(value)) {\n if (obj[entry] !== val) {\n modified = true;\n obj[entry] = val;\n }\n }\n } else {\n modified = true;\n this.#storage.set(key, value);\n }\n if (modified) {\n this.#setModified();\n }\n\n if (value instanceof AnnotationEditor) {\n (this.#editorsMap ||= new Map()).set(value.annotationElementId, value);\n if (typeof this.onAnnotationEditor === \"function\") {\n this.onAnnotationEditor(value.constructor._type);\n }\n }\n }\n\n /**\n * Check if the storage contains the given key.\n * @param {string} key\n * @returns {boolean}\n */\n has(key) {\n return this.#storage.has(key);\n }\n\n get size() {\n return this.#storage.size;\n }\n\n #setModified() {\n if (!this.#modified) {\n this.#modified = true;\n if (typeof this.onSetModified === \"function\") {\n this.onSetModified();\n }\n }\n }\n\n resetModified() {\n if (this.#modified) {\n this.#modified = false;\n if (typeof this.onResetModified === \"function\") {\n this.onResetModified();\n }\n }\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n get print() {\n return new PrintAnnotationStorage(this);\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n if (this.#storage.size === 0) {\n return SerializableEmpty;\n }\n const map = new Map(),\n hash = new MurmurHash3_64(),\n transfer = [];\n const context = Object.create(null);\n let hasBitmap = false;\n\n for (const [key, val] of this.#storage) {\n const serialized =\n val instanceof AnnotationEditor\n ? val.serialize(/* isForCopying = */ false, context)\n : val;\n if (serialized) {\n map.set(key, serialized);\n\n hash.update(`${key}:${JSON.stringify(serialized)}`);\n hasBitmap ||= !!serialized.bitmap;\n }\n }\n\n if (hasBitmap) {\n // We must transfer the bitmap data separately, since it can be changed\n // during serialization with SVG images.\n for (const value of map.values()) {\n if (value.bitmap) {\n transfer.push(value.bitmap);\n }\n }\n }\n\n return map.size > 0\n ? { map, hash: hash.hexdigest(), transfer }\n : SerializableEmpty;\n }\n\n get editorStats() {\n let stats = null;\n const typeToEditor = new Map();\n let numberOfEditedComments = 0;\n let numberOfDeletedComments = 0;\n for (const value of this.#storage.values()) {\n if (!(value instanceof AnnotationEditor)) {\n if (value.popup) {\n if (value.popup.deleted) {\n numberOfDeletedComments += 1;\n } else {\n numberOfEditedComments += 1;\n }\n }\n continue;\n }\n if (value.isCommentDeleted) {\n numberOfDeletedComments += 1;\n } else if (value.hasEditedComment) {\n numberOfEditedComments += 1;\n }\n const editorStats = value.telemetryFinalData;\n if (!editorStats) {\n continue;\n }\n const { type } = editorStats;\n if (!typeToEditor.has(type)) {\n typeToEditor.set(type, Object.getPrototypeOf(value).constructor);\n }\n stats ||= Object.create(null);\n const map = (stats[type] ||= new Map());\n for (const [key, val] of Object.entries(editorStats)) {\n if (key === \"type\") {\n continue;\n }\n let counters = map.get(key);\n if (!counters) {\n counters = new Map();\n map.set(key, counters);\n }\n const count = counters.get(val) ?? 0;\n counters.set(val, count + 1);\n }\n }\n if (numberOfDeletedComments > 0 || numberOfEditedComments > 0) {\n stats ||= Object.create(null);\n stats.comments = {\n deleted: numberOfDeletedComments,\n edited: numberOfEditedComments,\n };\n }\n if (!stats) {\n return null;\n }\n for (const [type, editor] of typeToEditor) {\n stats[type] = editor.computeTelemetryFinalData(stats[type]);\n }\n return stats;\n }\n\n resetModifiedIds() {\n this.#modifiedIds = null;\n }\n\n updateEditor(annotationId, data) {\n const value = this.#editorsMap?.get(annotationId);\n if (value) {\n value.updateFromAnnotationLayer(data);\n return true;\n }\n return false;\n }\n\n getEditor(annotationId) {\n return this.#editorsMap?.get(annotationId) || null;\n }\n\n /**\n * @returns {{ids: Set, hash: string}}\n */\n get modifiedIds() {\n if (this.#modifiedIds) {\n return this.#modifiedIds;\n }\n const ids = [];\n if (this.#editorsMap) {\n for (const value of this.#editorsMap.values()) {\n if (!value.serialize()) {\n continue;\n }\n ids.push(value.annotationElementId);\n }\n }\n return (this.#modifiedIds = {\n ids: new Set(ids),\n hash: ids.join(\",\"),\n });\n }\n\n [Symbol.iterator]() {\n return this.#storage.entries();\n }\n}\n\n/**\n * A special `AnnotationStorage` for use during printing, where the serializable\n * data is *frozen* upon initialization, to prevent scripting from modifying its\n * contents. (Necessary since printing is triggered synchronously in browsers.)\n */\nclass PrintAnnotationStorage extends AnnotationStorage {\n #serializable;\n\n constructor(parent) {\n super();\n const { map, hash, transfer } = parent.serializable;\n // Create a *copy* of the data, since Objects are passed by reference in JS.\n const clone = structuredClone(map, transfer ? { transfer } : null);\n\n this.#serializable = { map: clone, hash, transfer };\n }\n\n /**\n * @returns {PrintAnnotationStorage}\n */\n // eslint-disable-next-line getter-return\n get print() {\n unreachable(\"Should not call PrintAnnotationStorage.print\");\n }\n\n /**\n * PLEASE NOTE: Only intended for usage within the API itself.\n * @ignore\n */\n get serializable() {\n return this.#serializable;\n }\n\n get modifiedIds() {\n return shadow(this, \"modifiedIds\", {\n ids: new Set(),\n hash: \"\",\n });\n }\n}\n\nexport { AnnotationStorage, PrintAnnotationStorage, SerializableEmpty };\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\nimport {\n assert,\n FeatureTest,\n isNodeJS,\n shadow,\n string32,\n toBase64Util,\n unreachable,\n warn,\n} from \"../shared/util.js\";\n\nclass FontLoader {\n #systemFonts = new Set();\n\n constructor({\n ownerDocument = globalThis.document,\n styleElement = null, // For testing only.\n }) {\n this._document = ownerDocument;\n\n this.nativeFontFaces = new Set();\n this.styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? styleElement\n : null;\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n this.loadingRequests = [];\n this.loadTestFontId = 0;\n }\n }\n\n addNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.add(nativeFontFace);\n this._document.fonts.add(nativeFontFace);\n }\n\n removeNativeFontFace(nativeFontFace) {\n this.nativeFontFaces.delete(nativeFontFace);\n this._document.fonts.delete(nativeFontFace);\n }\n\n insertRule(rule) {\n if (!this.styleElement) {\n this.styleElement = this._document.createElement(\"style\");\n this._document.documentElement\n .getElementsByTagName(\"head\")[0]\n .append(this.styleElement);\n }\n const styleSheet = this.styleElement.sheet;\n styleSheet.insertRule(rule, styleSheet.cssRules.length);\n }\n\n clear() {\n for (const nativeFontFace of this.nativeFontFaces) {\n this._document.fonts.delete(nativeFontFace);\n }\n this.nativeFontFaces.clear();\n this.#systemFonts.clear();\n\n if (this.styleElement) {\n // Note: ChildNode.remove doesn't throw if the parentNode is undefined.\n this.styleElement.remove();\n this.styleElement = null;\n }\n }\n\n async loadSystemFont({\n systemFontInfo: info,\n disableFontFace,\n _inspectFont,\n }) {\n if (!info || this.#systemFonts.has(info.loadedName)) {\n return;\n }\n assert(\n !disableFontFace,\n \"loadSystemFont shouldn't be called when `disableFontFace` is set.\"\n );\n\n if (this.isFontLoadingAPISupported) {\n const { loadedName, src, style } = info;\n const fontFace = new FontFace(loadedName, src, style);\n this.addNativeFontFace(fontFace);\n try {\n await fontFace.load();\n this.#systemFonts.add(loadedName);\n _inspectFont?.(info);\n } catch {\n warn(\n `Cannot load system font: ${info.baseFontName}, installing it could help to improve PDF rendering.`\n );\n\n this.removeNativeFontFace(fontFace);\n }\n return;\n }\n\n unreachable(\n \"Not implemented: loadSystemFont without the Font Loading API.\"\n );\n }\n\n async bind(font) {\n // Add the font to the DOM only once; skip if the font is already loaded.\n if (font.attached || (font.missingFile && !font.systemFontInfo)) {\n return;\n }\n font.attached = true;\n\n if (font.systemFontInfo) {\n await this.loadSystemFont(font);\n return;\n }\n\n if (this.isFontLoadingAPISupported) {\n const nativeFontFace = font.createNativeFontFace();\n if (nativeFontFace) {\n this.addNativeFontFace(nativeFontFace);\n try {\n await nativeFontFace.loaded;\n } catch (ex) {\n warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);\n\n // When font loading failed, fall back to the built-in font renderer.\n font.disableFontFace = true;\n throw ex;\n }\n }\n return; // The font was, asynchronously, loaded.\n }\n\n // !this.isFontLoadingAPISupported\n const rule = font.createFontFaceRule();\n if (rule) {\n this.insertRule(rule);\n\n if (this.isSyncFontLoadingSupported) {\n return; // The font was, synchronously, loaded.\n }\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: async font loading\");\n }\n await new Promise(resolve => {\n const request = this._queueLoadingCallback(resolve);\n this._prepareFontLoadEvent(font, request);\n });\n // The font was, asynchronously, loaded.\n }\n }\n\n get isFontLoadingAPISupported() {\n const hasFonts = !!this._document?.fonts;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n return shadow(\n this,\n \"isFontLoadingAPISupported\",\n hasFonts && !this.styleElement\n );\n }\n return shadow(this, \"isFontLoadingAPISupported\", hasFonts);\n }\n\n get isSyncFontLoadingSupported() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return shadow(this, \"isSyncFontLoadingSupported\", true);\n }\n\n // Node.js - we can pretend that sync font loading is supported.\n // Firefox, from version 14, supports synchronous font loading.\n return shadow(\n this,\n \"isSyncFontLoadingSupported\",\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\")) &&\n (isNodeJS || FeatureTest.platform.isFirefox)\n );\n }\n\n _queueLoadingCallback(callback) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _queueLoadingCallback\");\n }\n\n function completeRequest() {\n assert(!request.done, \"completeRequest() cannot be called twice.\");\n request.done = true;\n\n // Sending all completed requests in order of how they were queued.\n while (loadingRequests.length > 0 && loadingRequests[0].done) {\n const otherRequest = loadingRequests.shift();\n setTimeout(otherRequest.callback, 0);\n }\n }\n\n const { loadingRequests } = this;\n const request = {\n done: false,\n complete: completeRequest,\n callback,\n };\n loadingRequests.push(request);\n return request;\n }\n\n get _loadTestFont() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _loadTestFont\");\n }\n\n // This is a CFF font with 1 glyph for '.' that fills its entire width\n // and height.\n const testFont = atob(\n \"T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQA\" +\n \"FQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAA\" +\n \"ALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgA\" +\n \"AAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1\" +\n \"AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD\" +\n \"6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACM\" +\n \"AooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4D\" +\n \"IP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAA\" +\n \"AAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUA\" +\n \"AQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgAB\" +\n \"AAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABY\" +\n \"AAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAA\" +\n \"AC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n \"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAA\" +\n \"AAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQAC\" +\n \"AQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3\" +\n \"Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTj\" +\n \"FQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==\"\n );\n return shadow(this, \"_loadTestFont\", testFont);\n }\n\n _prepareFontLoadEvent(font, request) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: _prepareFontLoadEvent\");\n }\n\n /** Hack begin */\n // There's currently no event when a font has finished downloading so the\n // following code is a dirty hack to 'guess' when a font is ready.\n // It's assumed fonts are loaded in order, so add a known test font after\n // the desired fonts and then test for the loading of that test font.\n\n function int32(data, offset) {\n return (\n (data.charCodeAt(offset) << 24) |\n (data.charCodeAt(offset + 1) << 16) |\n (data.charCodeAt(offset + 2) << 8) |\n (data.charCodeAt(offset + 3) & 0xff)\n );\n }\n function spliceString(s, offset, remove, insert) {\n const chunk1 = s.substring(0, offset);\n const chunk2 = s.substring(offset + remove);\n return chunk1 + insert + chunk2;\n }\n let i, ii;\n\n // The temporary canvas is used to determine if fonts are loaded.\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext(\"2d\");\n\n let called = 0;\n function isFontReady(name, callback) {\n // With setTimeout clamping this gives the font ~100ms to load.\n if (++called > 30) {\n warn(\"Load test font never loaded.\");\n callback();\n return;\n }\n ctx.font = \"30px \" + name;\n ctx.fillText(\".\", 0, 20);\n const imageData = ctx.getImageData(0, 0, 1, 1);\n if (imageData.data[3] > 0) {\n callback();\n return;\n }\n setTimeout(isFontReady.bind(null, name, callback));\n }\n\n const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;\n // Chromium seems to cache fonts based on a hash of the actual font data,\n // so the font must be modified for each load test else it will appear to\n // be loaded already.\n // TODO: This could maybe be made faster by avoiding the btoa of the full\n // font by splitting it in chunks before hand and padding the font id.\n let data = this._loadTestFont;\n const COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)\n data = spliceString(\n data,\n COMMENT_OFFSET,\n loadTestFontId.length,\n loadTestFontId\n );\n // CFF checksum is important for IE, adjusting it\n const CFF_CHECKSUM_OFFSET = 16;\n const XXXX_VALUE = 0x58585858; // the \"comment\" filled with 'X'\n let checksum = int32(data, CFF_CHECKSUM_OFFSET);\n for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;\n }\n if (i < loadTestFontId.length) {\n // align to 4 bytes boundary\n checksum = (checksum - XXXX_VALUE + int32(loadTestFontId + \"XXX\", i)) | 0;\n }\n data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));\n\n const url = `url(data:font/opentype;base64,${btoa(data)});`;\n const rule = `@font-face {font-family:\"${loadTestFontId}\";src:${url}}`;\n this.insertRule(rule);\n\n const div = this._document.createElement(\"div\");\n div.style.visibility = \"hidden\";\n div.style.width = div.style.height = \"10px\";\n div.style.position = \"absolute\";\n div.style.top = div.style.left = \"0px\";\n\n for (const name of [font.loadedName, loadTestFontId]) {\n const span = this._document.createElement(\"span\");\n span.textContent = \"Hi\";\n span.style.fontFamily = name;\n div.append(span);\n }\n this._document.body.append(div);\n\n isFontReady(loadTestFontId, () => {\n div.remove();\n request.complete();\n });\n /** Hack end */\n }\n}\n\nclass FontFaceObject {\n #fontData;\n\n constructor(translatedData, inspectFont = null, extra, charProcOperatorList) {\n this.compiledGlyphs = Object.create(null);\n this.#fontData = translatedData;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n if (typeof this.disableFontFace !== \"boolean\") {\n unreachable(\"disableFontFace must be available.\");\n }\n if (typeof this.fontExtraProperties !== \"boolean\") {\n unreachable(\"fontExtraProperties must be available.\");\n }\n }\n this._inspectFont = inspectFont;\n if (extra) {\n Object.assign(this, extra);\n }\n if (charProcOperatorList) {\n this.charProcOperatorList = charProcOperatorList;\n }\n }\n\n createNativeFontFace() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n let nativeFontFace;\n if (!this.cssFontInfo) {\n nativeFontFace = new FontFace(this.loadedName, this.data, {});\n } else {\n const css = {\n weight: this.cssFontInfo.fontWeight,\n };\n if (this.cssFontInfo.italicAngle) {\n css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;\n }\n nativeFontFace = new FontFace(\n this.cssFontInfo.fontFamily,\n this.data,\n css\n );\n }\n\n this._inspectFont?.(this);\n return nativeFontFace;\n }\n\n createFontFaceRule() {\n if (!this.data || this.disableFontFace) {\n return null;\n }\n // Add the @font-face rule to the document.\n const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`;\n let rule;\n if (!this.cssFontInfo) {\n rule = `@font-face {font-family:\"${this.loadedName}\";src:${url}}`;\n } else {\n let css = `font-weight: ${this.cssFontInfo.fontWeight};`;\n if (this.cssFontInfo.italicAngle) {\n css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;\n }\n rule = `@font-face {font-family:\"${this.cssFontInfo.fontFamily}\";${css}src:${url}}`;\n }\n\n this._inspectFont?.(this, url);\n return rule;\n }\n\n getPathGenerator(objs, character) {\n if (this.compiledGlyphs[character] !== undefined) {\n return this.compiledGlyphs[character];\n }\n\n const objId = this.loadedName + \"_path_\" + character;\n let cmds;\n try {\n cmds = objs.get(objId);\n } catch (ex) {\n warn(`getPathGenerator - ignoring character: \"${ex}\".`);\n }\n const path = new Path2D(cmds || \"\");\n\n if (!this.fontExtraProperties) {\n // Remove the raw path-string, since we don't need it anymore.\n objs.delete(objId);\n }\n return (this.compiledGlyphs[character] = path);\n }\n\n get black() {\n return this.#fontData.black;\n }\n\n get bold() {\n return this.#fontData.bold;\n }\n\n get disableFontFace() {\n return this.#fontData.disableFontFace ?? false;\n }\n\n get fontExtraProperties() {\n return this.#fontData.fontExtraProperties ?? false;\n }\n\n get isInvalidPDFjsFont() {\n return this.#fontData.isInvalidPDFjsFont;\n }\n\n get isType3Font() {\n return this.#fontData.isType3Font;\n }\n\n get italic() {\n return this.#fontData.italic;\n }\n\n get missingFile() {\n return this.#fontData.missingFile;\n }\n\n get remeasure() {\n return this.#fontData.remeasure;\n }\n\n get vertical() {\n return this.#fontData.vertical;\n }\n\n get ascent() {\n return this.#fontData.ascent;\n }\n\n get defaultWidth() {\n return this.#fontData.defaultWidth;\n }\n\n get descent() {\n return this.#fontData.descent;\n }\n\n get bbox() {\n return this.#fontData.bbox;\n }\n\n get fontMatrix() {\n return this.#fontData.fontMatrix;\n }\n\n get fallbackName() {\n return this.#fontData.fallbackName;\n }\n\n get loadedName() {\n return this.#fontData.loadedName;\n }\n\n get mimetype() {\n return this.#fontData.mimetype;\n }\n\n get name() {\n return this.#fontData.name;\n }\n\n get data() {\n return this.#fontData.data;\n }\n\n clearData() {\n this.#fontData.clearData();\n }\n\n get cssFontInfo() {\n return this.#fontData.cssFontInfo;\n }\n\n get systemFontInfo() {\n return this.#fontData.systemFontInfo;\n }\n\n get defaultVMetrics() {\n return this.#fontData.defaultVMetrics;\n }\n}\n\nexport { FontFaceObject, FontLoader };\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\nimport {\n _isValidExplicitDest,\n isNodeJS,\n stringToBytes,\n warn,\n} from \"../shared/util.js\";\n\nfunction getUrlProp(val) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n return null; // The 'url' is unused with `PDFDataRangeTransport`.\n }\n if (val instanceof URL) {\n return val.href;\n }\n if (typeof val === \"string\") {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ) {\n return val; // Use the url as-is in Node.js environments.\n }\n\n // The full path is required in the 'url' field.\n const url = URL.parse(val, window.location);\n if (url) {\n return url.href;\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}\n\nfunction getDataProp(val) {\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 throw new Error(\n \"Please provide binary data as `Uint8Array`, rather than `Buffer`.\"\n );\n }\n if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {\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 return val;\n }\n if (typeof val === \"string\") {\n return stringToBytes(val);\n }\n if (\n val instanceof ArrayBuffer ||\n ArrayBuffer.isView(val) ||\n (typeof val === \"object\" && !isNaN(val?.length))\n ) {\n return new Uint8Array(val);\n }\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\nfunction getFactoryUrlProp(val) {\n if (typeof val !== \"string\") {\n return null;\n }\n if (val.endsWith(\"/\")) {\n return val;\n }\n throw new Error(`Invalid factory url: \"${val}\" must include trailing slash.`);\n}\n\nconst isRefProxy = v =>\n typeof v === \"object\" &&\n Number.isInteger(v?.num) &&\n v.num >= 0 &&\n Number.isInteger(v?.gen) &&\n v.gen >= 0;\n\nconst isNameProxy = v => typeof v === \"object\" && typeof v?.name === \"string\";\n\nconst isValidExplicitDest = _isValidExplicitDest.bind(\n null,\n /* validRef = */ isRefProxy,\n /* validName = */ isNameProxy\n);\n\nclass LoopbackPort {\n #listeners = new Map();\n\n #deferred = Promise.resolve();\n\n postMessage(obj, transfer) {\n const event = {\n data: structuredClone(obj, transfer ? { transfer } : null),\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, options = null) {\n let rmAbort = null;\n if (options?.signal instanceof AbortSignal) {\n const { signal } = options;\n if (signal.aborted) {\n warn(\"LoopbackPort - cannot use an `aborted` signal.\");\n return;\n }\n const onAbort = () => this.removeEventListener(name, listener);\n rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n signal.addEventListener(\"abort\", onAbort);\n }\n this.#listeners.set(listener, rmAbort);\n }\n\n removeEventListener(name, listener) {\n const rmAbort = this.#listeners.get(listener);\n rmAbort?.();\n\n this.#listeners.delete(listener);\n }\n\n terminate() {\n for (const [, rmAbort] of this.#listeners) {\n rmAbort?.();\n }\n this.#listeners.clear();\n }\n}\n\nexport {\n getDataProp,\n getFactoryUrlProp,\n getUrlProp,\n isNameProxy,\n isRefProxy,\n isValidExplicitDest,\n LoopbackPort,\n};\n","/* Copyright 2018 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\nimport {\n AbortException,\n assert,\n InvalidPDFException,\n PasswordException,\n ResponseException,\n UnknownErrorException,\n unreachable,\n} from \"./util.js\";\n\nconst CallbackKind = {\n DATA: 1,\n ERROR: 2,\n};\n\nconst StreamKind = {\n CANCEL: 1,\n CANCEL_COMPLETE: 2,\n CLOSE: 3,\n ENQUEUE: 4,\n ERROR: 5,\n PULL: 6,\n PULL_COMPLETE: 7,\n START_COMPLETE: 8,\n};\n\nfunction onFn() {}\n\nfunction wrapReason(ex) {\n if (\n ex instanceof AbortException ||\n ex instanceof InvalidPDFException ||\n ex instanceof PasswordException ||\n ex instanceof ResponseException ||\n ex instanceof UnknownErrorException\n ) {\n // Avoid re-creating the exception when its type is already correct.\n return ex;\n }\n\n if (!(ex instanceof Error || (typeof ex === \"object\" && ex !== null))) {\n unreachable(\n 'wrapReason: Expected \"reason\" to be a (possibly cloned) Error.'\n );\n }\n switch (ex.name) {\n case \"AbortException\":\n return new AbortException(ex.message);\n case \"InvalidPDFException\":\n return new InvalidPDFException(ex.message);\n case \"PasswordException\":\n return new PasswordException(ex.message, ex.code);\n case \"ResponseException\":\n return new ResponseException(ex.message, ex.status, ex.missing);\n case \"UnknownErrorException\":\n return new UnknownErrorException(ex.message, ex.details);\n }\n return new UnknownErrorException(ex.message, ex.toString());\n}\n\nclass MessageHandler {\n #messageAC = new AbortController();\n\n constructor(sourceName, targetName, comObj) {\n this.sourceName = sourceName;\n this.targetName = targetName;\n this.comObj = comObj;\n this.callbackId = 1;\n this.streamId = 1;\n this.streamSinks = Object.create(null);\n this.streamControllers = Object.create(null);\n this.callbackCapabilities = Object.create(null);\n this.actionHandler = Object.create(null);\n\n comObj.addEventListener(\"message\", this.#onMessage.bind(this), {\n signal: this.#messageAC.signal,\n });\n }\n\n #onMessage({ data }) {\n if (data.targetName !== this.sourceName) {\n return;\n }\n if (data.stream) {\n this.#processStreamMessage(data);\n return;\n }\n if (data.callback) {\n const callbackId = data.callbackId;\n const capability = this.callbackCapabilities[callbackId];\n if (!capability) {\n throw new Error(`Cannot resolve callback ${callbackId}`);\n }\n delete this.callbackCapabilities[callbackId];\n\n if (data.callback === CallbackKind.DATA) {\n capability.resolve(data.data);\n } else if (data.callback === CallbackKind.ERROR) {\n capability.reject(wrapReason(data.reason));\n } else {\n throw new Error(\"Unexpected callback case\");\n }\n return;\n }\n const action = this.actionHandler[data.action];\n if (!action) {\n throw new Error(`Unknown action from worker: ${data.action}`);\n }\n if (data.callbackId) {\n const sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n\n Promise.try(action, data.data).then(\n function (result) {\n comObj.postMessage({\n sourceName,\n targetName,\n callback: CallbackKind.DATA,\n callbackId: data.callbackId,\n data: result,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n callback: CallbackKind.ERROR,\n callbackId: data.callbackId,\n reason: wrapReason(reason),\n });\n }\n );\n return;\n }\n if (data.streamId) {\n this.#createStreamSink(data);\n return;\n }\n action(data.data);\n }\n\n on(actionName, handler) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n typeof handler === \"function\",\n 'MessageHandler.on: Expected \"handler\" to be a function.'\n );\n }\n const ah = this.actionHandler;\n if (ah[actionName]) {\n throw new Error(`There is already an actionName called \"${actionName}\"`);\n }\n ah[actionName] = handler;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n */\n send(actionName, data, transfers) {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n data,\n },\n transfers\n );\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expects that the other side will callback with the response.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {Promise} Promise to be resolved with response data.\n */\n sendWithPromise(actionName, data, transfers) {\n const callbackId = this.callbackId++;\n const capability = Promise.withResolvers();\n this.callbackCapabilities[callbackId] = capability;\n try {\n this.comObj.postMessage(\n {\n sourceName: this.sourceName,\n targetName: this.targetName,\n action: actionName,\n callbackId,\n data,\n },\n transfers\n );\n } catch (ex) {\n capability.reject(ex);\n }\n return capability.promise;\n }\n\n /**\n * Sends a message to the comObj to invoke the action with the supplied data.\n * Expect that the other side will callback to signal 'start_complete'.\n * @param {string} actionName - Action to call.\n * @param {JSON} data - JSON data to send.\n * @param {Object} queueingStrategy - Strategy to signal backpressure based on\n * internal queue.\n * @param {Array} [transfers] - List of transfers/ArrayBuffers.\n * @returns {ReadableStream} ReadableStream to read data in chunks.\n */\n sendWithStream(actionName, data, queueingStrategy, transfers) {\n const streamId = this.streamId++,\n sourceName = this.sourceName,\n targetName = this.targetName,\n comObj = this.comObj;\n\n return new ReadableStream(\n {\n start: controller => {\n const startCapability = Promise.withResolvers();\n this.streamControllers[streamId] = {\n controller,\n startCall: startCapability,\n pullCall: null,\n cancelCall: null,\n isClosed: false,\n };\n comObj.postMessage(\n {\n sourceName,\n targetName,\n action: actionName,\n streamId,\n data,\n desiredSize: controller.desiredSize,\n },\n transfers\n );\n // Return Promise for Async process, to signal success/failure.\n return startCapability.promise;\n },\n\n pull: controller => {\n const pullCapability = Promise.withResolvers();\n this.streamControllers[streamId].pullCall = pullCapability;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL,\n streamId,\n desiredSize: controller.desiredSize,\n });\n // Returning Promise will not call \"pull\"\n // again until current pull is resolved.\n return pullCapability.promise;\n },\n\n cancel: reason => {\n assert(reason instanceof Error, \"cancel must have a valid reason\");\n const cancelCapability = Promise.withResolvers();\n this.streamControllers[streamId].cancelCall = cancelCapability;\n this.streamControllers[streamId].isClosed = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL,\n streamId,\n reason: wrapReason(reason),\n });\n // Return Promise to signal success or failure.\n return cancelCapability.promise;\n },\n },\n queueingStrategy\n );\n }\n\n #createStreamSink(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const self = this,\n action = this.actionHandler[data.action];\n\n const streamSink = {\n enqueue(chunk, size = 1, transfers) {\n if (this.isCancelled) {\n return;\n }\n const lastDesiredSize = this.desiredSize;\n this.desiredSize -= size;\n // Enqueue decreases the desiredSize property of sink,\n // so when it changes from positive to negative,\n // set ready as unresolved promise.\n if (lastDesiredSize > 0 && this.desiredSize <= 0) {\n this.sinkCapability = Promise.withResolvers();\n this.ready = this.sinkCapability.promise;\n }\n comObj.postMessage(\n {\n sourceName,\n targetName,\n stream: StreamKind.ENQUEUE,\n streamId,\n chunk,\n },\n transfers\n );\n },\n\n close() {\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CLOSE,\n streamId,\n });\n delete self.streamSinks[streamId];\n },\n\n error(reason) {\n assert(reason instanceof Error, \"error must have a valid reason\");\n if (this.isCancelled) {\n return;\n }\n this.isCancelled = true;\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.ERROR,\n streamId,\n reason: wrapReason(reason),\n });\n },\n\n sinkCapability: Promise.withResolvers(),\n onPull: null,\n onCancel: null,\n isCancelled: false,\n desiredSize: data.desiredSize,\n ready: null,\n };\n\n streamSink.sinkCapability.resolve();\n streamSink.ready = streamSink.sinkCapability.promise;\n this.streamSinks[streamId] = streamSink;\n\n Promise.try(action, data.data, streamSink).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.START_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n }\n\n #processStreamMessage(data) {\n const streamId = data.streamId,\n sourceName = this.sourceName,\n targetName = data.sourceName,\n comObj = this.comObj;\n const streamController = this.streamControllers[streamId],\n streamSink = this.streamSinks[streamId];\n\n switch (data.stream) {\n case StreamKind.START_COMPLETE:\n if (data.success) {\n streamController.startCall.resolve();\n } else {\n streamController.startCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL_COMPLETE:\n if (data.success) {\n streamController.pullCall.resolve();\n } else {\n streamController.pullCall.reject(wrapReason(data.reason));\n }\n break;\n case StreamKind.PULL:\n // Ignore any pull after close is called.\n if (!streamSink) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n break;\n }\n // Pull increases the desiredSize property of sink, so when it changes\n // from negative to positive, set ready property as resolved promise.\n if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {\n streamSink.sinkCapability.resolve();\n }\n // Reset desiredSize property of sink on every pull.\n streamSink.desiredSize = data.desiredSize;\n\n Promise.try(streamSink.onPull || onFn).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.PULL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n break;\n case StreamKind.ENQUEUE:\n assert(streamController, \"enqueue should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.controller.enqueue(data.chunk);\n break;\n case StreamKind.CLOSE:\n assert(streamController, \"close should have stream controller\");\n if (streamController.isClosed) {\n break;\n }\n streamController.isClosed = true;\n streamController.controller.close();\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.ERROR:\n assert(streamController, \"error should have stream controller\");\n streamController.controller.error(wrapReason(data.reason));\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL_COMPLETE:\n if (data.success) {\n streamController.cancelCall.resolve();\n } else {\n streamController.cancelCall.reject(wrapReason(data.reason));\n }\n this.#deleteStreamController(streamController, streamId);\n break;\n case StreamKind.CANCEL:\n if (!streamSink) {\n break;\n }\n const dataReason = wrapReason(data.reason);\n\n Promise.try(streamSink.onCancel || onFn, dataReason).then(\n function () {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n success: true,\n });\n },\n function (reason) {\n comObj.postMessage({\n sourceName,\n targetName,\n stream: StreamKind.CANCEL_COMPLETE,\n streamId,\n reason: wrapReason(reason),\n });\n }\n );\n streamSink.sinkCapability.reject(dataReason);\n streamSink.isCancelled = true;\n delete this.streamSinks[streamId];\n break;\n default:\n throw new Error(\"Unexpected stream case\");\n }\n }\n\n async #deleteStreamController(streamController, streamId) {\n // Delete the `streamController` only when the start, pull, and cancel\n // capabilities have settled, to prevent `TypeError`s.\n await Promise.allSettled([\n streamController.startCall?.promise,\n streamController.pullCall?.promise,\n streamController.cancelCall?.promise,\n ]);\n delete this.streamControllers[streamId];\n }\n\n destroy() {\n this.#messageAC?.abort();\n this.#messageAC = null;\n }\n}\n\nexport { MessageHandler, wrapReason };\n","/* Copyright 2015 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\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseCanvasFactory {\n #enableHWA = false;\n\n constructor({ enableHWA = false }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseCanvasFactory\n ) {\n unreachable(\"Cannot initialize BaseCanvasFactory.\");\n }\n this.#enableHWA = enableHWA;\n }\n\n create(width, height) {\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n const canvas = this._createCanvas(width, height);\n return {\n canvas,\n context: canvas.getContext(\"2d\", {\n willReadFrequently: !this.#enableHWA,\n }),\n };\n }\n\n reset(canvasAndContext, width, height) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n if (width <= 0 || height <= 0) {\n throw new Error(\"Invalid canvas size\");\n }\n canvasAndContext.canvas.width = width;\n canvasAndContext.canvas.height = height;\n }\n\n destroy(canvasAndContext) {\n if (!canvasAndContext.canvas) {\n throw new Error(\"Canvas is not specified\");\n }\n // Zeroing the width and height cause Firefox to release graphics\n // resources immediately, which can greatly reduce memory consumption.\n canvasAndContext.canvas.width = 0;\n canvasAndContext.canvas.height = 0;\n canvasAndContext.canvas = null;\n canvasAndContext.context = null;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n unreachable(\"Abstract method `_createCanvas` called.\");\n }\n}\n\nclass DOMCanvasFactory extends BaseCanvasFactory {\n constructor({ ownerDocument = globalThis.document, enableHWA = false }) {\n super({ enableHWA });\n this._document = ownerDocument;\n }\n\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const canvas = this._document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n return canvas;\n }\n}\n\nexport { BaseCanvasFactory, DOMCanvasFactory };\n","/* Copyright 2015 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\nimport { stringToBytes, unreachable } from \"../shared/util.js\";\nimport { fetchData } from \"./display_utils.js\";\n\nclass BaseCMapReaderFactory {\n constructor({ baseUrl = null, isCompressed = true }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseCMapReaderFactory\n ) {\n unreachable(\"Cannot initialize BaseCMapReaderFactory.\");\n }\n this.baseUrl = baseUrl;\n this.isCompressed = isCompressed;\n }\n\n async fetch({ name }) {\n if (!this.baseUrl) {\n throw new Error(\n \"Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.\"\n );\n }\n if (!name) {\n throw new Error(\"CMap name must be specified.\");\n }\n const url = this.baseUrl + name + (this.isCompressed ? \".bcmap\" : \"\");\n\n return this._fetch(url)\n .then(cMapData => ({ cMapData, isCompressed: this.isCompressed }))\n .catch(reason => {\n throw new Error(\n `Unable to load ${this.isCompressed ? \"binary \" : \"\"}CMap at: ${url}`\n );\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(\n url,\n /* type = */ this.isCompressed ? \"arraybuffer\" : \"text\"\n );\n return data instanceof ArrayBuffer\n ? new Uint8Array(data)\n : stringToBytes(data);\n }\n}\n\nexport { BaseCMapReaderFactory, DOMCMapReaderFactory };\n","/* Copyright 2015 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\nimport { getRGB, isDataScheme, SVG_NS } from \"./display_utils.js\";\nimport { unreachable, updateUrlHash, Util, warn } from \"../shared/util.js\";\n\nclass BaseFilterFactory {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseFilterFactory\n ) {\n unreachable(\"Cannot initialize BaseFilterFactory.\");\n }\n }\n\n addFilter(maps) {\n return \"none\";\n }\n\n addHCMFilter(fgColor, bgColor) {\n return \"none\";\n }\n\n addAlphaFilter(map) {\n return \"none\";\n }\n\n addLuminosityFilter(map) {\n return \"none\";\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n return \"none\";\n }\n\n destroy(keepHCM = false) {}\n}\n\n/**\n * FilterFactory aims to create some SVG filters we can use when drawing an\n * image (or whatever) on a canvas.\n * Filters aren't applied with ctx.putImageData because it just overwrites the\n * underlying pixels.\n * With these filters, it's possible for example to apply some transfer maps on\n * an image without the need to apply them on the pixel arrays: the renderer\n * does the magic for us.\n */\nclass DOMFilterFactory extends BaseFilterFactory {\n #baseUrl;\n\n #_cache;\n\n #_defs;\n\n #docId;\n\n #document;\n\n #_hcmCache;\n\n #id = 0;\n\n constructor({ docId, ownerDocument = globalThis.document }) {\n super();\n this.#docId = docId;\n this.#document = ownerDocument;\n }\n\n get #cache() {\n return (this.#_cache ||= new Map());\n }\n\n get #hcmCache() {\n return (this.#_hcmCache ||= new Map());\n }\n\n get #defs() {\n if (!this.#_defs) {\n const div = this.#document.createElement(\"div\");\n const { style } = div;\n style.visibility = \"hidden\";\n style.contain = \"strict\";\n style.width = style.height = 0;\n style.position = \"absolute\";\n style.top = style.left = 0;\n style.zIndex = -1;\n\n const svg = this.#document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"width\", 0);\n svg.setAttribute(\"height\", 0);\n this.#_defs = this.#document.createElementNS(SVG_NS, \"defs\");\n div.append(svg);\n svg.append(this.#_defs);\n this.#document.body.append(div);\n }\n return this.#_defs;\n }\n\n #createTables(maps) {\n if (maps.length === 1) {\n const mapR = maps[0];\n const buffer = new Array(256);\n for (let i = 0; i < 256; i++) {\n buffer[i] = mapR[i] / 255;\n }\n\n const table = buffer.join(\",\");\n return [table, table, table];\n }\n\n const [mapR, mapG, mapB] = maps;\n const bufferR = new Array(256);\n const bufferG = new Array(256);\n const bufferB = new Array(256);\n for (let i = 0; i < 256; i++) {\n bufferR[i] = mapR[i] / 255;\n bufferG[i] = mapG[i] / 255;\n bufferB[i] = mapB[i] / 255;\n }\n return [bufferR.join(\",\"), bufferG.join(\",\"), bufferB.join(\",\")];\n }\n\n #createUrl(id) {\n if (this.#baseUrl === undefined) {\n // Unless a ``-element is present a relative URL should work.\n this.#baseUrl = \"\";\n\n const url = this.#document.URL;\n if (url !== this.#document.baseURI) {\n if (isDataScheme(url)) {\n warn('#createUrl: ignore \"data:\"-URL for performance reasons.');\n } else {\n this.#baseUrl = updateUrlHash(url, \"\");\n }\n }\n }\n return `url(${this.#baseUrl}#${id})`;\n }\n\n addFilter(maps) {\n if (!maps) {\n return \"none\";\n }\n\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(maps);\n if (value) {\n return value;\n }\n\n const [tableR, tableG, tableB] = this.#createTables(maps);\n const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(maps, value);\n return value;\n }\n\n // We create a SVG filter: feComponentTransferElement\n // https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement\n\n const id = `g_${this.#docId}_transfer_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(maps, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapConversion(tableR, tableG, tableB, filter);\n\n return url;\n }\n\n addHCMFilter(fgColor, bgColor) {\n const key = `${fgColor}-${bgColor}`;\n const filterName = \"base\";\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const fgRGB = this.#getRGB(fgColor);\n fgColor = Util.makeHexColor(...fgRGB);\n const bgRGB = this.#getRGB(bgColor);\n bgColor = Util.makeHexColor(...bgRGB);\n this.#defs.style.color = \"\";\n\n if (\n (fgColor === \"#000000\" && bgColor === \"#ffffff\") ||\n fgColor === bgColor\n ) {\n return info.url;\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_Colors_and_Luminance\n //\n // Relative luminance:\n // https://www.w3.org/TR/WCAG20/#relativeluminancedef\n //\n // We compute the rounded luminance of the default background color.\n // Then for every color in the pdf, if its rounded luminance is the\n // same as the background one then it's replaced by the new\n // background color else by the foreground one.\n const map = new Array(256);\n for (let i = 0; i <= 255; i++) {\n const x = i / 255;\n map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;\n }\n const table = map.join(\",\");\n\n const id = `g_${this.#docId}_hcm_filter`;\n const filter = (info.filter = this.#createFilter(id));\n this.#addTransferMapConversion(table, table, table, filter);\n this.#addGrayConversion(filter);\n\n const getSteps = (c, n) => {\n const start = fgRGB[c] / 255;\n const end = bgRGB[c] / 255;\n const arr = new Array(n + 1);\n for (let i = 0; i <= n; i++) {\n arr[i] = start + (i / n) * (end - start);\n }\n return arr.join(\",\");\n };\n this.#addTransferMapConversion(\n getSteps(0, 5),\n getSteps(1, 5),\n getSteps(2, 5),\n filter\n );\n\n info.url = this.#createUrl(id);\n return info.url;\n }\n\n addAlphaFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map);\n if (value) {\n return value;\n }\n\n const [tableA] = this.#createTables([map]);\n const key = `alpha_${tableA}`;\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_alpha_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addTransferMapAlphaConversion(tableA, filter);\n\n return url;\n }\n\n addLuminosityFilter(map) {\n // When a page is zoomed the page is re-drawn but the maps are likely\n // the same.\n let value = this.#cache.get(map || \"luminosity\");\n if (value) {\n return value;\n }\n\n let tableA, key;\n if (map) {\n [tableA] = this.#createTables([map]);\n key = `luminosity_${tableA}`;\n } else {\n key = \"luminosity\";\n }\n\n value = this.#cache.get(key);\n if (value) {\n this.#cache.set(map, value);\n return value;\n }\n\n const id = `g_${this.#docId}_luminosity_map_${this.#id++}`;\n const url = this.#createUrl(id);\n this.#cache.set(map, url);\n this.#cache.set(key, url);\n\n const filter = this.#createFilter(id);\n this.#addLuminosityConversion(filter);\n if (map) {\n this.#addTransferMapAlphaConversion(tableA, filter);\n }\n\n return url;\n }\n\n addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {\n const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;\n let info = this.#hcmCache.get(filterName);\n if (info?.key === key) {\n return info.url;\n }\n\n if (info) {\n info.filter?.remove();\n info.key = key;\n info.url = \"none\";\n info.filter = null;\n } else {\n info = {\n key,\n url: \"none\",\n filter: null,\n };\n this.#hcmCache.set(filterName, info);\n }\n\n if (!fgColor || !bgColor) {\n return info.url;\n }\n\n const [fgRGB, bgRGB] = [fgColor, bgColor].map(this.#getRGB.bind(this));\n let fgGray = Math.round(\n 0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]\n );\n let bgGray = Math.round(\n 0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]\n );\n let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(\n this.#getRGB.bind(this)\n );\n if (bgGray < fgGray) {\n [fgGray, bgGray, newFgRGB, newBgRGB] = [\n bgGray,\n fgGray,\n newBgRGB,\n newFgRGB,\n ];\n }\n this.#defs.style.color = \"\";\n\n // Now we can create the filters to highlight some canvas parts.\n // The colors in the pdf will almost be Canvas and CanvasText, hence we\n // want to filter them to finally get Highlight and HighlightText.\n // Since we're in HCM the background color and the foreground color should\n // be really different when converted to grayscale (if they're not then it\n // means that we've a poor contrast). Once the canvas colors are converted\n // to grayscale we can easily map them on their new colors.\n // The grayscale step is important because if we've something like:\n // fgColor = #FF....\n // bgColor = #FF....\n // then we are enable to map the red component on the new red components\n // which can be different.\n\n const getSteps = (fg, bg, n) => {\n const arr = new Array(256);\n const step = (bgGray - fgGray) / n;\n const newStart = fg / 255;\n const newStep = (bg - fg) / (255 * n);\n let prev = 0;\n for (let i = 0; i <= n; i++) {\n const k = Math.round(fgGray + i * step);\n const value = newStart + i * newStep;\n for (let j = prev; j <= k; j++) {\n arr[j] = value;\n }\n prev = k + 1;\n }\n for (let i = prev; i < 256; i++) {\n arr[i] = arr[prev - 1];\n }\n return arr.join(\",\");\n };\n\n const id = `g_${this.#docId}_hcm_${filterName}_filter`;\n const filter = (info.filter = this.#createFilter(id));\n\n this.#addGrayConversion(filter);\n this.#addTransferMapConversion(\n getSteps(newFgRGB[0], newBgRGB[0], 5),\n getSteps(newFgRGB[1], newBgRGB[1], 5),\n getSteps(newFgRGB[2], newBgRGB[2], 5),\n filter\n );\n\n info.url = this.#createUrl(id);\n return info.url;\n }\n\n destroy(keepHCM = false) {\n if (keepHCM && this.#_hcmCache?.size) {\n return;\n }\n this.#_defs?.parentNode.parentNode.remove();\n this.#_defs = null;\n\n this.#_cache?.clear();\n this.#_cache = null;\n\n this.#_hcmCache?.clear();\n this.#_hcmCache = null;\n\n this.#id = 0;\n }\n\n #addLuminosityConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #addGrayConversion(filter) {\n const feColorMatrix = this.#document.createElementNS(\n SVG_NS,\n \"feColorMatrix\"\n );\n feColorMatrix.setAttribute(\"type\", \"matrix\");\n feColorMatrix.setAttribute(\n \"values\",\n \"0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0\"\n );\n filter.append(feColorMatrix);\n }\n\n #createFilter(id) {\n const filter = this.#document.createElementNS(SVG_NS, \"filter\");\n filter.setAttribute(\"color-interpolation-filters\", \"sRGB\");\n filter.setAttribute(\"id\", id);\n this.#defs.append(filter);\n\n return filter;\n }\n\n #appendFeFunc(feComponentTransfer, func, table) {\n const feFunc = this.#document.createElementNS(SVG_NS, func);\n feFunc.setAttribute(\"type\", \"discrete\");\n feFunc.setAttribute(\"tableValues\", table);\n feComponentTransfer.append(feFunc);\n }\n\n #addTransferMapConversion(rTable, gTable, bTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncR\", rTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncG\", gTable);\n this.#appendFeFunc(feComponentTransfer, \"feFuncB\", bTable);\n }\n\n #addTransferMapAlphaConversion(aTable, filter) {\n const feComponentTransfer = this.#document.createElementNS(\n SVG_NS,\n \"feComponentTransfer\"\n );\n filter.append(feComponentTransfer);\n this.#appendFeFunc(feComponentTransfer, \"feFuncA\", aTable);\n }\n\n #getRGB(color) {\n this.#defs.style.color = color;\n return getRGB(getComputedStyle(this.#defs).getPropertyValue(\"color\"));\n }\n}\n\nexport { BaseFilterFactory, DOMFilterFactory };\n","/* Copyright 2015 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\nimport { fetchData } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseStandardFontDataFactory {\n constructor({ baseUrl = null }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseStandardFontDataFactory\n ) {\n unreachable(\"Cannot initialize BaseStandardFontDataFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n\n async fetch({ filename }) {\n if (!this.baseUrl) {\n throw new Error(\n \"Ensure that the `standardFontDataUrl` API parameter is provided.\"\n );\n }\n if (!filename) {\n throw new Error(\"Font filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n\n return this._fetch(url).catch(reason => {\n throw new Error(`Unable to load font data at: ${url}`);\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(url, /* type = */ \"arraybuffer\");\n return new Uint8Array(data);\n }\n}\n\nexport { BaseStandardFontDataFactory, DOMStandardFontDataFactory };\n","/* Copyright 2015 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\nimport { fetchData } from \"./display_utils.js\";\nimport { unreachable } from \"../shared/util.js\";\n\nclass BaseWasmFactory {\n constructor({ baseUrl = null }) {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseWasmFactory\n ) {\n unreachable(\"Cannot initialize BaseWasmFactory.\");\n }\n this.baseUrl = baseUrl;\n }\n\n async fetch({ filename }) {\n if (!this.baseUrl) {\n throw new Error(\"Ensure that the `wasmUrl` API parameter is provided.\");\n }\n if (!filename) {\n throw new Error(\"Wasm filename must be specified.\");\n }\n const url = `${this.baseUrl}${filename}`;\n\n return this._fetch(url).catch(reason => {\n throw new Error(`Unable to load wasm data at: ${url}`);\n });\n }\n\n /**\n * @ignore\n * @returns {Promise}\n */\n async _fetch(url) {\n unreachable(\"Abstract method `_fetch` called.\");\n }\n}\n\nclass DOMWasmFactory extends BaseWasmFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n const data = await fetchData(url, /* type = */ \"arraybuffer\");\n return new Uint8Array(data);\n }\n}\n\nexport { BaseWasmFactory, DOMWasmFactory };\n","/* Copyright 2020 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/* globals process */\n\nimport { isNodeJS, warn } from \"../shared/util.js\";\nimport { BaseCanvasFactory } from \"./canvas_factory.js\";\nimport { BaseCMapReaderFactory } from \"./cmap_reader_factory.js\";\nimport { BaseFilterFactory } from \"./filter_factory.js\";\nimport { BaseStandardFontDataFactory } from \"./standard_fontdata_factory.js\";\nimport { BaseWasmFactory } from \"./wasm_factory.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_utils.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nif (isNodeJS) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"SKIP_BABEL\")) {\n warn(\"Please use the `legacy` build in Node.js environments.\");\n } else {\n let canvas;\n try {\n const require = process\n .getBuiltinModule(\"module\")\n .createRequire(import.meta.url);\n\n try {\n canvas = require(\"@napi-rs/canvas\");\n } catch (ex) {\n warn(`Cannot load \"@napi-rs/canvas\" package: \"${ex}\".`);\n }\n } catch (ex) {\n warn(`Cannot access the \\`require\\` function: \"${ex}\".`);\n }\n\n if (!globalThis.DOMMatrix) {\n if (canvas?.DOMMatrix) {\n globalThis.DOMMatrix = canvas.DOMMatrix;\n } else {\n warn(\"Cannot polyfill `DOMMatrix`, rendering may be broken.\");\n }\n }\n if (!globalThis.ImageData) {\n if (canvas?.ImageData) {\n globalThis.ImageData = canvas.ImageData;\n } else {\n warn(\"Cannot polyfill `ImageData`, rendering may be broken.\");\n }\n }\n if (!globalThis.Path2D) {\n if (canvas?.Path2D) {\n globalThis.Path2D = canvas.Path2D;\n } else {\n warn(\"Cannot polyfill `Path2D`, rendering may be broken.\");\n }\n }\n if (!globalThis.navigator?.language) {\n globalThis.navigator = {\n language: \"en-US\",\n platform: \"\",\n userAgent: \"\",\n };\n }\n }\n}\n\nasync function fetchData(url) {\n const fs = process.getBuiltinModule(\"fs\");\n const data = await fs.promises.readFile(url);\n return new Uint8Array(data);\n}\n\nclass NodeFilterFactory extends BaseFilterFactory {}\n\nclass NodeCanvasFactory extends BaseCanvasFactory {\n /**\n * @ignore\n */\n _createCanvas(width, height) {\n const require = process\n .getBuiltinModule(\"module\")\n .createRequire(import.meta.url);\n const canvas = require(\"@napi-rs/canvas\");\n return canvas.createCanvas(width, height);\n }\n}\n\nclass NodeCMapReaderFactory extends BaseCMapReaderFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nclass NodeStandardFontDataFactory extends BaseStandardFontDataFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nclass NodeWasmFactory extends BaseWasmFactory {\n /**\n * @ignore\n */\n async _fetch(url) {\n return fetchData(url);\n }\n}\n\nexport {\n fetchData,\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodeStandardFontDataFactory,\n NodeWasmFactory,\n};\n","import { Util } from \"../shared/util.js\";\n\nconst FORCED_DEPENDENCY_LABEL = \"__forcedDependency\";\n\nconst { floor, ceil } = Math;\n\nfunction expandBBox(array, index, minX, minY, maxX, maxY) {\n array[index * 4 + 0] = Math.min(array[index * 4 + 0], minX);\n array[index * 4 + 1] = Math.min(array[index * 4 + 1], minY);\n array[index * 4 + 2] = Math.max(array[index * 4 + 2], maxX);\n array[index * 4 + 3] = Math.max(array[index * 4 + 3], maxY);\n}\n\n// This is computed rathter than hard-coded to keep into\n// account the platform's endianess.\nconst EMPTY_BBOX = new Uint32Array(new Uint8Array([255, 255, 0, 0]).buffer)[0];\n\nclass BBoxReader {\n #bboxes;\n\n #coords;\n\n constructor(bboxes, coords) {\n this.#bboxes = bboxes;\n this.#coords = coords;\n }\n\n get length() {\n return this.#bboxes.length;\n }\n\n isEmpty(i) {\n return this.#bboxes[i] === EMPTY_BBOX;\n }\n\n minX(i) {\n return this.#coords[i * 4 + 0] / 256;\n }\n\n minY(i) {\n return this.#coords[i * 4 + 1] / 256;\n }\n\n maxX(i) {\n return (this.#coords[i * 4 + 2] + 1) / 256;\n }\n\n maxY(i) {\n return (this.#coords[i * 4 + 3] + 1) / 256;\n }\n}\n\nconst ensureDebugMetadata = (map, key) => {\n if (!map) {\n return undefined;\n }\n let value = map.get(key);\n if (!value) {\n value = { dependencies: new Set(), isRenderingOperation: false };\n map.set(key, value);\n }\n return value;\n};\n\n/**\n * @typedef {\"lineWidth\" | \"lineCap\" | \"lineJoin\" | \"miterLimit\" | \"dash\" |\n * \"strokeAlpha\" | \"fillColor\" | \"fillAlpha\" | \"globalCompositeOperation\" |\n * \"path\" | \"filter\" | \"font\" | \"fontObj\"} SimpleDependency\n */\n\n/**\n * @typedef {\"transform\" | \"moveText\" | \"sameLineText\"} IncrementalDependency\n */\n\n/**\n * @typedef {IncrementalDependency |\n * typeof FORCED_DEPENDENCY_LABEL} InternalIncrementalDependency\n */\nclass CanvasDependencyTracker {\n /** @type {Record} */\n #simple = { __proto__: null };\n\n /** @type {Record} */\n #incremental = {\n __proto__: null,\n transform: [],\n moveText: [],\n sameLineText: [],\n [FORCED_DEPENDENCY_LABEL]: [],\n };\n\n #namedDependencies = new Map();\n\n #savesStack = [];\n\n #markedContentStack = [];\n\n #baseTransformStack = [[1, 0, 0, 1, 0, 0]];\n\n #clipBox = [-Infinity, -Infinity, Infinity, Infinity];\n\n // Float32Array\n #pendingBBox = new Float64Array([Infinity, Infinity, -Infinity, -Infinity]);\n\n #pendingBBoxIdx = -1;\n\n #pendingDependencies = new Set();\n\n #operations = new Map();\n\n #fontBBoxTrustworthy = new Map();\n\n #canvasWidth;\n\n #canvasHeight;\n\n // Uint8ClampedArray\n #bboxesCoords;\n\n #bboxes;\n\n #debugMetadata;\n\n constructor(canvas, operationsCount, recordDebugMetadata = false) {\n this.#canvasWidth = canvas.width;\n this.#canvasHeight = canvas.height;\n this.#initializeBBoxes(operationsCount);\n if (recordDebugMetadata) {\n this.#debugMetadata = new Map();\n }\n }\n\n growOperationsCount(operationsCount) {\n if (operationsCount >= this.#bboxes.length) {\n this.#initializeBBoxes(operationsCount, this.#bboxes);\n }\n }\n\n #initializeBBoxes(operationsCount, oldBBoxes) {\n const buffer = new ArrayBuffer(operationsCount * 4);\n this.#bboxesCoords = new Uint8ClampedArray(buffer);\n this.#bboxes = new Uint32Array(buffer);\n if (oldBBoxes && oldBBoxes.length > 0) {\n this.#bboxes.set(oldBBoxes);\n this.#bboxes.fill(EMPTY_BBOX, oldBBoxes.length);\n } else {\n this.#bboxes.fill(EMPTY_BBOX);\n }\n }\n\n save(opIdx) {\n this.#simple = { __proto__: this.#simple };\n this.#incremental = {\n __proto__: this.#incremental,\n transform: { __proto__: this.#incremental.transform },\n moveText: { __proto__: this.#incremental.moveText },\n sameLineText: { __proto__: this.#incremental.sameLineText },\n [FORCED_DEPENDENCY_LABEL]: {\n __proto__: this.#incremental[FORCED_DEPENDENCY_LABEL],\n },\n };\n this.#clipBox = { __proto__: this.#clipBox };\n this.#savesStack.push(opIdx);\n\n return this;\n }\n\n restore(opIdx) {\n const previous = Object.getPrototypeOf(this.#simple);\n if (previous === null) {\n // Sometimes we call more .restore() than .save(), for\n // example when using CanvasGraphics' #restoreInitialState()\n return this;\n }\n this.#simple = previous;\n this.#incremental = Object.getPrototypeOf(this.#incremental);\n this.#clipBox = Object.getPrototypeOf(this.#clipBox);\n\n const lastSave = this.#savesStack.pop();\n if (lastSave !== undefined) {\n ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(\n lastSave\n );\n this.#bboxes[opIdx] = this.#bboxes[lastSave];\n }\n\n return this;\n }\n\n /**\n * @param {number} idx\n */\n recordOpenMarker(idx) {\n this.#savesStack.push(idx);\n return this;\n }\n\n getOpenMarker() {\n if (this.#savesStack.length === 0) {\n return null;\n }\n return this.#savesStack.at(-1);\n }\n\n recordCloseMarker(opIdx) {\n const lastSave = this.#savesStack.pop();\n if (lastSave !== undefined) {\n ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(\n lastSave\n );\n this.#bboxes[opIdx] = this.#bboxes[lastSave];\n }\n return this;\n }\n\n // Marked content needs a separate stack from save/restore, because they\n // form two independent trees.\n beginMarkedContent(opIdx) {\n this.#markedContentStack.push(opIdx);\n return this;\n }\n\n endMarkedContent(opIdx) {\n const lastSave = this.#markedContentStack.pop();\n if (lastSave !== undefined) {\n ensureDebugMetadata(this.#debugMetadata, opIdx)?.dependencies.add(\n lastSave\n );\n this.#bboxes[opIdx] = this.#bboxes[lastSave];\n }\n return this;\n }\n\n pushBaseTransform(ctx) {\n this.#baseTransformStack.push(\n Util.multiplyByDOMMatrix(\n this.#baseTransformStack.at(-1),\n ctx.getTransform()\n )\n );\n return this;\n }\n\n popBaseTransform() {\n if (this.#baseTransformStack.length > 1) {\n this.#baseTransformStack.pop();\n }\n return this;\n }\n\n /**\n * @param {SimpleDependency} name\n * @param {number} idx\n */\n recordSimpleData(name, idx) {\n this.#simple[name] = idx;\n return this;\n }\n\n /**\n * @param {IncrementalDependency} name\n * @param {number} idx\n */\n recordIncrementalData(name, idx) {\n this.#incremental[name].push(idx);\n return this;\n }\n\n /**\n * @param {IncrementalDependency} name\n * @param {number} idx\n */\n resetIncrementalData(name, idx) {\n this.#incremental[name].length = 0;\n return this;\n }\n\n recordNamedData(name, idx) {\n this.#namedDependencies.set(name, idx);\n return this;\n }\n\n /**\n * @param {SimpleDependency} name\n * @param {string} depName\n * @param {number} fallbackIdx\n */\n recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n this.#simple[name] = this.#namedDependencies.get(depName) ?? fallbackIdx;\n }\n\n // All next operations, until the next .restore(), will depend on this\n recordFutureForcedDependency(name, idx) {\n this.recordIncrementalData(FORCED_DEPENDENCY_LABEL, idx);\n return this;\n }\n\n // All next operations, until the next .restore(), will depend on all\n // the already recorded data with the given names.\n inheritSimpleDataAsFutureForcedDependencies(names) {\n for (const name of names) {\n if (name in this.#simple) {\n this.recordFutureForcedDependency(name, this.#simple[name]);\n }\n }\n return this;\n }\n\n inheritPendingDependenciesAsFutureForcedDependencies() {\n for (const dep of this.#pendingDependencies) {\n this.recordFutureForcedDependency(FORCED_DEPENDENCY_LABEL, dep);\n }\n return this;\n }\n\n resetBBox(idx) {\n if (this.#pendingBBoxIdx !== idx) {\n this.#pendingBBoxIdx = idx;\n this.#pendingBBox[0] = Infinity;\n this.#pendingBBox[1] = Infinity;\n this.#pendingBBox[2] = -Infinity;\n this.#pendingBBox[3] = -Infinity;\n }\n return this;\n }\n\n recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n const transform = Util.multiplyByDOMMatrix(\n this.#baseTransformStack.at(-1),\n ctx.getTransform()\n );\n const clipBox = [Infinity, Infinity, -Infinity, -Infinity];\n Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, clipBox);\n const intersection = Util.intersect(this.#clipBox, clipBox);\n if (intersection) {\n this.#clipBox[0] = intersection[0];\n this.#clipBox[1] = intersection[1];\n this.#clipBox[2] = intersection[2];\n this.#clipBox[3] = intersection[3];\n } else {\n this.#clipBox[0] = this.#clipBox[1] = Infinity;\n this.#clipBox[2] = this.#clipBox[3] = -Infinity;\n }\n return this;\n }\n\n recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n const clipBox = this.#clipBox;\n if (clipBox[0] === Infinity) {\n return this;\n }\n\n const transform = Util.multiplyByDOMMatrix(\n this.#baseTransformStack.at(-1),\n ctx.getTransform()\n );\n if (clipBox[0] === -Infinity) {\n Util.axialAlignedBoundingBox(\n [minX, minY, maxX, maxY],\n transform,\n this.#pendingBBox\n );\n return this;\n }\n\n const bbox = [Infinity, Infinity, -Infinity, -Infinity];\n Util.axialAlignedBoundingBox([minX, minY, maxX, maxY], transform, bbox);\n this.#pendingBBox[0] = Math.min(\n this.#pendingBBox[0],\n Math.max(bbox[0], clipBox[0])\n );\n this.#pendingBBox[1] = Math.min(\n this.#pendingBBox[1],\n Math.max(bbox[1], clipBox[1])\n );\n this.#pendingBBox[2] = Math.max(\n this.#pendingBBox[2],\n Math.min(bbox[2], clipBox[2])\n );\n this.#pendingBBox[3] = Math.max(\n this.#pendingBBox[3],\n Math.min(bbox[3], clipBox[3])\n );\n return this;\n }\n\n recordCharacterBBox(idx, ctx, font, scale = 1, x = 0, y = 0, getMeasure) {\n const fontBBox = font.bbox;\n let isBBoxTrustworthy;\n let computedBBox;\n\n if (fontBBox) {\n isBBoxTrustworthy =\n // Only use the bounding box defined by the font if it\n // has a non-empty area.\n fontBBox[2] !== fontBBox[0] &&\n fontBBox[3] !== fontBBox[1] &&\n this.#fontBBoxTrustworthy.get(font);\n\n if (isBBoxTrustworthy !== false) {\n computedBBox = [0, 0, 0, 0];\n Util.axialAlignedBoundingBox(fontBBox, font.fontMatrix, computedBBox);\n if (scale !== 1 || x !== 0 || y !== 0) {\n Util.scaleMinMax([scale, 0, 0, -scale, x, y], computedBBox);\n }\n\n if (isBBoxTrustworthy) {\n return this.recordBBox(\n idx,\n ctx,\n computedBBox[0],\n computedBBox[2],\n computedBBox[1],\n computedBBox[3]\n );\n }\n }\n }\n\n if (!getMeasure) {\n // We have no way of telling how big this character actually is, record\n // a full page bounding box.\n return this.recordFullPageBBox(idx);\n }\n\n const measure = getMeasure();\n\n if (fontBBox && computedBBox && isBBoxTrustworthy === undefined) {\n // If it's the first time we can compare the font bbox with the actual\n // bbox measured when drawing it, check if the one recorded in the font\n // is large enough to cover the actual bbox. If it is, we assume that the\n // font is well-formed and we can use the declared bbox without having to\n // measure it again for every character.\n isBBoxTrustworthy =\n computedBBox[0] <= x - measure.actualBoundingBoxLeft &&\n computedBBox[2] >= x + measure.actualBoundingBoxRight &&\n computedBBox[1] <= y - measure.actualBoundingBoxAscent &&\n computedBBox[3] >= y + measure.actualBoundingBoxDescent;\n this.#fontBBoxTrustworthy.set(font, isBBoxTrustworthy);\n if (isBBoxTrustworthy) {\n return this.recordBBox(\n idx,\n ctx,\n computedBBox[0],\n computedBBox[2],\n computedBBox[1],\n computedBBox[3]\n );\n }\n }\n\n // The font has no bbox or it is not trustworthy, so we need to\n // return the bounding box based on .measureText().\n return this.recordBBox(\n idx,\n ctx,\n x - measure.actualBoundingBoxLeft,\n x + measure.actualBoundingBoxRight,\n y - measure.actualBoundingBoxAscent,\n y + measure.actualBoundingBoxDescent\n );\n }\n\n recordFullPageBBox(idx) {\n this.#pendingBBox[0] = Math.max(0, this.#clipBox[0]);\n this.#pendingBBox[1] = Math.max(0, this.#clipBox[1]);\n this.#pendingBBox[2] = Math.min(this.#canvasWidth, this.#clipBox[2]);\n this.#pendingBBox[3] = Math.min(this.#canvasHeight, this.#clipBox[3]);\n\n return this;\n }\n\n getSimpleIndex(dependencyName) {\n return this.#simple[dependencyName];\n }\n\n recordDependencies(idx, dependencyNames) {\n const pendingDependencies = this.#pendingDependencies;\n const simple = this.#simple;\n const incremental = this.#incremental;\n for (const name of dependencyNames) {\n if (name in this.#simple) {\n pendingDependencies.add(simple[name]);\n } else if (name in incremental) {\n incremental[name].forEach(pendingDependencies.add, pendingDependencies);\n }\n }\n\n return this;\n }\n\n recordNamedDependency(idx, name) {\n if (this.#namedDependencies.has(name)) {\n this.#pendingDependencies.add(this.#namedDependencies.get(name));\n }\n\n return this;\n }\n\n /**\n * @param {number} idx\n */\n recordOperation(idx, preserve = false) {\n this.recordDependencies(idx, [FORCED_DEPENDENCY_LABEL]);\n\n if (this.#debugMetadata) {\n const metadata = ensureDebugMetadata(this.#debugMetadata, idx);\n const { dependencies } = metadata;\n this.#pendingDependencies.forEach(dependencies.add, dependencies);\n this.#savesStack.forEach(dependencies.add, dependencies);\n this.#markedContentStack.forEach(dependencies.add, dependencies);\n dependencies.delete(idx);\n metadata.isRenderingOperation = true;\n }\n\n if (this.#pendingBBoxIdx === idx) {\n const minX = floor((this.#pendingBBox[0] * 256) / this.#canvasWidth);\n const minY = floor((this.#pendingBBox[1] * 256) / this.#canvasHeight);\n const maxX = ceil((this.#pendingBBox[2] * 256) / this.#canvasWidth);\n const maxY = ceil((this.#pendingBBox[3] * 256) / this.#canvasHeight);\n\n expandBBox(this.#bboxesCoords, idx, minX, minY, maxX, maxY);\n for (const depIdx of this.#pendingDependencies) {\n if (depIdx !== idx) {\n expandBBox(this.#bboxesCoords, depIdx, minX, minY, maxX, maxY);\n }\n }\n for (const saveIdx of this.#savesStack) {\n if (saveIdx !== idx) {\n expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY);\n }\n }\n for (const saveIdx of this.#markedContentStack) {\n if (saveIdx !== idx) {\n expandBBox(this.#bboxesCoords, saveIdx, minX, minY, maxX, maxY);\n }\n }\n\n if (!preserve) {\n this.#pendingDependencies.clear();\n this.#pendingBBoxIdx = -1;\n }\n }\n\n return this;\n }\n\n recordShowTextOperation(idx, preserve = false) {\n const deps = Array.from(this.#pendingDependencies);\n this.recordOperation(idx, preserve);\n this.recordIncrementalData(\"sameLineText\", idx);\n for (const dep of deps) {\n this.recordIncrementalData(\"sameLineText\", dep);\n }\n return this;\n }\n\n bboxToClipBoxDropOperation(idx, preserve = false) {\n if (this.#pendingBBoxIdx === idx) {\n this.#pendingBBoxIdx = -1;\n\n this.#clipBox[0] = Math.max(this.#clipBox[0], this.#pendingBBox[0]);\n this.#clipBox[1] = Math.max(this.#clipBox[1], this.#pendingBBox[1]);\n this.#clipBox[2] = Math.min(this.#clipBox[2], this.#pendingBBox[2]);\n this.#clipBox[3] = Math.min(this.#clipBox[3], this.#pendingBBox[3]);\n\n if (!preserve) {\n this.#pendingDependencies.clear();\n }\n }\n return this;\n }\n\n _takePendingDependencies() {\n const pendingDependencies = this.#pendingDependencies;\n this.#pendingDependencies = new Set();\n return pendingDependencies;\n }\n\n _extractOperation(idx) {\n const operation = this.#operations.get(idx);\n this.#operations.delete(idx);\n return operation;\n }\n\n _pushPendingDependencies(dependencies) {\n for (const dep of dependencies) {\n this.#pendingDependencies.add(dep);\n }\n }\n\n take() {\n this.#fontBBoxTrustworthy.clear();\n return new BBoxReader(this.#bboxes, this.#bboxesCoords);\n }\n\n takeDebugMetadata() {\n return this.#debugMetadata;\n }\n}\n\n/**\n * Used to track dependencies of nested operations list, that\n * should actually all map to the index of the operation that\n * contains the nested list.\n *\n * @implements {CanvasDependencyTracker}\n */\nclass CanvasNestedDependencyTracker {\n /** @type {CanvasDependencyTracker} */\n #dependencyTracker;\n\n /** @type {number} */\n #opIdx;\n\n #ignoreBBoxes;\n\n #nestingLevel = 0;\n\n #savesLevel = 0;\n\n constructor(dependencyTracker, opIdx, ignoreBBoxes) {\n if (\n dependencyTracker instanceof CanvasNestedDependencyTracker &&\n dependencyTracker.#ignoreBBoxes === !!ignoreBBoxes\n ) {\n // The goal of CanvasNestedDependencyTracker is to collapse all operations\n // into a single one. If we are already in a\n // CanvasNestedDependencyTracker, that is already happening.\n return dependencyTracker;\n }\n\n this.#dependencyTracker = dependencyTracker;\n this.#opIdx = opIdx;\n this.#ignoreBBoxes = !!ignoreBBoxes;\n }\n\n growOperationsCount() {\n throw new Error(\"Unreachable\");\n }\n\n save(opIdx) {\n this.#savesLevel++;\n this.#dependencyTracker.save(this.#opIdx);\n return this;\n }\n\n restore(opIdx) {\n if (this.#savesLevel > 0) {\n this.#dependencyTracker.restore(this.#opIdx);\n this.#savesLevel--;\n }\n return this;\n }\n\n recordOpenMarker(idx) {\n this.#nestingLevel++;\n return this;\n }\n\n getOpenMarker() {\n return this.#nestingLevel > 0\n ? this.#opIdx\n : this.#dependencyTracker.getOpenMarker();\n }\n\n recordCloseMarker(idx) {\n this.#nestingLevel--;\n return this;\n }\n\n beginMarkedContent(opIdx) {\n return this;\n }\n\n endMarkedContent(opIdx) {\n return this;\n }\n\n pushBaseTransform(ctx) {\n this.#dependencyTracker.pushBaseTransform(ctx);\n return this;\n }\n\n popBaseTransform() {\n this.#dependencyTracker.popBaseTransform();\n return this;\n }\n\n /**\n * @param {SimpleDependency} name\n * @param {number} idx\n */\n recordSimpleData(name, idx) {\n this.#dependencyTracker.recordSimpleData(name, this.#opIdx);\n return this;\n }\n\n /**\n * @param {IncrementalDependency} name\n * @param {number} idx\n */\n recordIncrementalData(name, idx) {\n this.#dependencyTracker.recordIncrementalData(name, this.#opIdx);\n return this;\n }\n\n /**\n * @param {IncrementalDependency} name\n * @param {number} idx\n */\n resetIncrementalData(name, idx) {\n this.#dependencyTracker.resetIncrementalData(name, this.#opIdx);\n return this;\n }\n\n recordNamedData(name, idx) {\n // Nested dependencies are not visible to the outside.\n return this;\n }\n\n /**\n * @param {SimpleDependency} name\n * @param {string} depName\n * @param {number} fallbackIdx\n */\n recordSimpleDataFromNamed(name, depName, fallbackIdx) {\n this.#dependencyTracker.recordSimpleDataFromNamed(\n name,\n depName,\n this.#opIdx\n );\n return this;\n }\n\n // All next operations, until the next .restore(), will depend on this\n recordFutureForcedDependency(name, idx) {\n this.#dependencyTracker.recordFutureForcedDependency(name, this.#opIdx);\n return this;\n }\n\n // All next operations, until the next .restore(), will depend on all\n // the already recorded data with the given names.\n inheritSimpleDataAsFutureForcedDependencies(names) {\n this.#dependencyTracker.inheritSimpleDataAsFutureForcedDependencies(names);\n return this;\n }\n\n inheritPendingDependenciesAsFutureForcedDependencies() {\n this.#dependencyTracker.inheritPendingDependenciesAsFutureForcedDependencies();\n return this;\n }\n\n resetBBox(idx) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.resetBBox(this.#opIdx);\n }\n return this;\n }\n\n recordClipBox(idx, ctx, minX, maxX, minY, maxY) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.recordClipBox(\n this.#opIdx,\n ctx,\n minX,\n maxX,\n minY,\n maxY\n );\n }\n return this;\n }\n\n recordBBox(idx, ctx, minX, maxX, minY, maxY) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.recordBBox(\n this.#opIdx,\n ctx,\n minX,\n maxX,\n minY,\n maxY\n );\n }\n return this;\n }\n\n recordCharacterBBox(idx, ctx, font, scale, x, y, getMeasure) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.recordCharacterBBox(\n this.#opIdx,\n ctx,\n font,\n scale,\n x,\n y,\n getMeasure\n );\n }\n return this;\n }\n\n recordFullPageBBox(idx) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.recordFullPageBBox(this.#opIdx);\n }\n return this;\n }\n\n getSimpleIndex(dependencyName) {\n return this.#dependencyTracker.getSimpleIndex(dependencyName);\n }\n\n recordDependencies(idx, dependencyNames) {\n this.#dependencyTracker.recordDependencies(this.#opIdx, dependencyNames);\n return this;\n }\n\n recordNamedDependency(idx, name) {\n this.#dependencyTracker.recordNamedDependency(this.#opIdx, name);\n return this;\n }\n\n /**\n * @param {number} idx\n * @param {SimpleDependency[]} dependencyNames\n */\n recordOperation(idx) {\n this.#dependencyTracker.recordOperation(this.#opIdx, true);\n return this;\n }\n\n recordShowTextOperation(idx) {\n this.#dependencyTracker.recordShowTextOperation(this.#opIdx, true);\n return this;\n }\n\n bboxToClipBoxDropOperation(idx) {\n if (!this.#ignoreBBoxes) {\n this.#dependencyTracker.bboxToClipBoxDropOperation(this.#opIdx, true);\n }\n return this;\n }\n\n take() {\n throw new Error(\"Unreachable\");\n }\n\n takeDebugMetadata() {\n throw new Error(\"Unreachable\");\n }\n}\n\n/** @satisfies {Record} */\nconst Dependencies = {\n stroke: [\n \"path\",\n \"transform\",\n \"filter\",\n \"strokeColor\",\n \"strokeAlpha\",\n \"lineWidth\",\n \"lineCap\",\n \"lineJoin\",\n \"miterLimit\",\n \"dash\",\n ],\n fill: [\n \"path\",\n \"transform\",\n \"filter\",\n \"fillColor\",\n \"fillAlpha\",\n \"globalCompositeOperation\",\n \"SMask\",\n ],\n imageXObject: [\n \"transform\",\n \"SMask\",\n \"filter\",\n \"fillAlpha\",\n \"strokeAlpha\",\n \"globalCompositeOperation\",\n ],\n rawFillPath: [\"filter\", \"fillColor\", \"fillAlpha\"],\n showText: [\n \"transform\",\n \"leading\",\n \"charSpacing\",\n \"wordSpacing\",\n \"hScale\",\n \"textRise\",\n \"moveText\",\n \"textMatrix\",\n \"font\",\n \"fontObj\",\n \"filter\",\n \"fillColor\",\n \"textRenderingMode\",\n \"SMask\",\n \"fillAlpha\",\n \"strokeAlpha\",\n \"globalCompositeOperation\",\n\n \"sameLineText\",\n ],\n transform: [\"transform\"],\n transformAndFill: [\"transform\", \"fillColor\"],\n};\n\nexport { CanvasDependencyTracker, CanvasNestedDependencyTracker, Dependencies };\n","/* Copyright 2014 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\nimport { FormatError, info, unreachable, Util } from \"../shared/util.js\";\nimport { getCurrentTransform } from \"./display_utils.js\";\n\nconst PathType = {\n FILL: \"Fill\",\n STROKE: \"Stroke\",\n SHADING: \"Shading\",\n};\n\nfunction applyBoundingBox(ctx, bbox) {\n if (!bbox) {\n return;\n }\n const width = bbox[2] - bbox[0];\n const height = bbox[3] - bbox[1];\n const region = new Path2D();\n region.rect(bbox[0], bbox[1], width, height);\n ctx.clip(region);\n}\n\nclass BaseShadingPattern {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseShadingPattern\n ) {\n unreachable(\"Cannot initialize BaseShadingPattern.\");\n }\n }\n\n isModifyingCurrentTransform() {\n return false;\n }\n\n getPattern() {\n unreachable(\"Abstract method `getPattern` called.\");\n }\n}\n\nclass RadialAxialShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._type = IR[1];\n this._bbox = IR[2];\n this._colorStops = IR[3];\n this._p0 = IR[4];\n this._p1 = IR[5];\n this._r0 = IR[6];\n this._r1 = IR[7];\n this.matrix = null;\n }\n\n _createGradient(ctx) {\n let grad;\n if (this._type === \"axial\") {\n grad = ctx.createLinearGradient(\n this._p0[0],\n this._p0[1],\n this._p1[0],\n this._p1[1]\n );\n } else if (this._type === \"radial\") {\n grad = ctx.createRadialGradient(\n this._p0[0],\n this._p0[1],\n this._r0,\n this._p1[0],\n this._p1[1],\n this._r1\n );\n }\n\n for (const colorStop of this._colorStops) {\n grad.addColorStop(colorStop[0], colorStop[1]);\n }\n return grad;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n let pattern;\n if (pathType === PathType.STROKE || pathType === PathType.FILL) {\n const ownerBBox = owner.current.getClippedPathBoundingBox(\n pathType,\n getCurrentTransform(ctx)\n ) || [0, 0, 0, 0];\n // Create a canvas that is only as big as the current path. This doesn't\n // allow us to cache the pattern, but it generally creates much smaller\n // canvases and saves memory use. See bug 1722807 for an example.\n const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;\n const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n width,\n height\n );\n\n const tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n tmpCtx.beginPath();\n tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);\n // Non shading fill patterns are positioned relative to the base transform\n // (usually the page's initial transform), but we may have created a\n // smaller canvas based on the path, so we must account for the shift.\n tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);\n inverse = Util.transform(inverse, [\n 1,\n 0,\n 0,\n 1,\n ownerBBox[0],\n ownerBBox[1],\n ]);\n\n tmpCtx.transform(...owner.baseTransform);\n if (this.matrix) {\n tmpCtx.transform(...this.matrix);\n }\n applyBoundingBox(tmpCtx, this._bbox);\n\n tmpCtx.fillStyle = this._createGradient(tmpCtx);\n tmpCtx.fill();\n\n pattern = ctx.createPattern(tmpCanvas.canvas, \"no-repeat\");\n const domMatrix = new DOMMatrix(inverse);\n pattern.setTransform(domMatrix);\n } else {\n // Shading fills are applied relative to the current matrix which is also\n // how canvas gradients work, so there's no need to do anything special\n // here.\n applyBoundingBox(ctx, this._bbox);\n pattern = this._createGradient(ctx);\n }\n return pattern;\n }\n}\n\nfunction drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {\n // Very basic Gouraud-shaded triangle rasterization algorithm.\n const coords = context.coords,\n colors = context.colors;\n const bytes = data.data,\n rowSize = data.width * 4;\n let tmp;\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n if (coords[p2 + 1] > coords[p3 + 1]) {\n tmp = p2;\n p2 = p3;\n p3 = tmp;\n tmp = c2;\n c2 = c3;\n c3 = tmp;\n }\n if (coords[p1 + 1] > coords[p2 + 1]) {\n tmp = p1;\n p1 = p2;\n p2 = tmp;\n tmp = c1;\n c1 = c2;\n c2 = tmp;\n }\n const x1 = (coords[p1] + context.offsetX) * context.scaleX;\n const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;\n const x2 = (coords[p2] + context.offsetX) * context.scaleX;\n const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;\n const x3 = (coords[p3] + context.offsetX) * context.scaleX;\n const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;\n if (y1 >= y3) {\n return;\n }\n const c1r = colors[c1],\n c1g = colors[c1 + 1],\n c1b = colors[c1 + 2];\n const c2r = colors[c2],\n c2g = colors[c2 + 1],\n c2b = colors[c2 + 2];\n const c3r = colors[c3],\n c3g = colors[c3 + 1],\n c3b = colors[c3 + 2];\n\n const minY = Math.round(y1),\n maxY = Math.round(y3);\n let xa, car, cag, cab;\n let xb, cbr, cbg, cbb;\n for (let y = minY; y <= maxY; y++) {\n if (y < y2) {\n const k = y < y1 ? 0 : (y1 - y) / (y1 - y2);\n xa = x1 - (x1 - x2) * k;\n car = c1r - (c1r - c2r) * k;\n cag = c1g - (c1g - c2g) * k;\n cab = c1b - (c1b - c2b) * k;\n } else {\n let k;\n if (y > y3) {\n k = 1;\n } else if (y2 === y3) {\n k = 0;\n } else {\n k = (y2 - y) / (y2 - y3);\n }\n xa = x2 - (x2 - x3) * k;\n car = c2r - (c2r - c3r) * k;\n cag = c2g - (c2g - c3g) * k;\n cab = c2b - (c2b - c3b) * k;\n }\n\n let k;\n if (y < y1) {\n k = 0;\n } else if (y > y3) {\n k = 1;\n } else {\n k = (y1 - y) / (y1 - y3);\n }\n xb = x1 - (x1 - x3) * k;\n cbr = c1r - (c1r - c3r) * k;\n cbg = c1g - (c1g - c3g) * k;\n cbb = c1b - (c1b - c3b) * k;\n const x1_ = Math.round(Math.min(xa, xb));\n const x2_ = Math.round(Math.max(xa, xb));\n let j = rowSize * y + x1_ * 4;\n for (let x = x1_; x <= x2_; x++) {\n k = (xa - x) / (xa - xb);\n if (k < 0) {\n k = 0;\n } else if (k > 1) {\n k = 1;\n }\n bytes[j++] = (car - (car - cbr) * k) | 0;\n bytes[j++] = (cag - (cag - cbg) * k) | 0;\n bytes[j++] = (cab - (cab - cbb) * k) | 0;\n bytes[j++] = 255;\n }\n }\n}\n\nfunction drawFigure(data, figure, context) {\n const ps = figure.coords;\n const cs = figure.colors;\n let i, ii;\n switch (figure.type) {\n case \"lattice\":\n const verticesPerRow = figure.verticesPerRow;\n const rows = Math.floor(ps.length / verticesPerRow) - 1;\n const cols = verticesPerRow - 1;\n for (i = 0; i < rows; i++) {\n let q = i * verticesPerRow;\n for (let j = 0; j < cols; j++, q++) {\n drawTriangle(\n data,\n context,\n ps[q],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n drawTriangle(\n data,\n context,\n ps[q + verticesPerRow + 1],\n ps[q + 1],\n ps[q + verticesPerRow],\n cs[q + verticesPerRow + 1],\n cs[q + 1],\n cs[q + verticesPerRow]\n );\n }\n }\n break;\n case \"triangles\":\n for (i = 0, ii = ps.length; i < ii; i += 3) {\n drawTriangle(\n data,\n context,\n ps[i],\n ps[i + 1],\n ps[i + 2],\n cs[i],\n cs[i + 1],\n cs[i + 2]\n );\n }\n break;\n default:\n throw new Error(\"illegal figure\");\n }\n}\n\nclass MeshShadingPattern extends BaseShadingPattern {\n constructor(IR) {\n super();\n this._coords = IR[2];\n this._colors = IR[3];\n this._figures = IR[4];\n this._bounds = IR[5];\n this._bbox = IR[6];\n this._background = IR[7];\n this.matrix = null;\n }\n\n _createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {\n // we will increase scale on some weird factor to let antialiasing take\n // care of \"rough\" edges\n const EXPECTED_SCALE = 1.1;\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n const MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough\n // We need to keep transparent border around our pattern for fill():\n // createPattern with 'no-repeat' will bleed edges across entire area.\n const BORDER_SIZE = 2;\n\n const offsetX = Math.floor(this._bounds[0]);\n const offsetY = Math.floor(this._bounds[1]);\n const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;\n const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;\n\n const width = Math.min(\n Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const height = Math.min(\n Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)),\n MAX_PATTERN_SIZE\n );\n const scaleX = boundsWidth / width;\n const scaleY = boundsHeight / height;\n\n const context = {\n coords: this._coords,\n colors: this._colors,\n offsetX: -offsetX,\n offsetY: -offsetY,\n scaleX: 1 / scaleX,\n scaleY: 1 / scaleY,\n };\n\n const paddedWidth = width + BORDER_SIZE * 2;\n const paddedHeight = height + BORDER_SIZE * 2;\n\n const tmpCanvas = cachedCanvases.getCanvas(\n \"mesh\",\n paddedWidth,\n paddedHeight\n );\n const tmpCtx = tmpCanvas.context;\n\n const data = tmpCtx.createImageData(width, height);\n if (backgroundColor) {\n const bytes = data.data;\n for (let i = 0, ii = bytes.length; i < ii; i += 4) {\n bytes[i] = backgroundColor[0];\n bytes[i + 1] = backgroundColor[1];\n bytes[i + 2] = backgroundColor[2];\n bytes[i + 3] = 255;\n }\n }\n for (const figure of this._figures) {\n drawFigure(data, figure, context);\n }\n tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);\n const canvas = tmpCanvas.canvas;\n\n return {\n canvas,\n offsetX: offsetX - BORDER_SIZE * scaleX,\n offsetY: offsetY - BORDER_SIZE * scaleY,\n scaleX,\n scaleY,\n };\n }\n\n isModifyingCurrentTransform() {\n return true;\n }\n\n getPattern(ctx, owner, inverse, pathType) {\n applyBoundingBox(ctx, this._bbox);\n const scale = new Float32Array(2);\n if (pathType === PathType.SHADING) {\n Util.singularValueDecompose2dScale(getCurrentTransform(ctx), scale);\n } else if (this.matrix) {\n // Obtain scale from matrix and current transformation matrix.\n Util.singularValueDecompose2dScale(this.matrix, scale);\n const [matrixScaleX, matrixScaleY] = scale;\n Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n scale[0] *= matrixScaleX;\n scale[1] *= matrixScaleY;\n } else {\n Util.singularValueDecompose2dScale(owner.baseTransform, scale);\n }\n\n // Rasterizing on the main thread since sending/queue large canvases\n // might cause OOM.\n const temporaryPatternCanvas = this._createMeshCanvas(\n scale,\n pathType === PathType.SHADING ? null : this._background,\n owner.cachedCanvases\n );\n\n if (pathType !== PathType.SHADING) {\n ctx.setTransform(...owner.baseTransform);\n if (this.matrix) {\n ctx.transform(...this.matrix);\n }\n }\n\n ctx.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);\n\n return ctx.createPattern(temporaryPatternCanvas.canvas, \"no-repeat\");\n }\n}\n\nclass DummyShadingPattern extends BaseShadingPattern {\n getPattern() {\n return \"hotpink\";\n }\n}\n\nfunction getShadingPattern(IR) {\n switch (IR[0]) {\n case \"RadialAxial\":\n return new RadialAxialShadingPattern(IR);\n case \"Mesh\":\n return new MeshShadingPattern(IR);\n case \"Dummy\":\n return new DummyShadingPattern();\n }\n throw new Error(`Unknown IR type: ${IR[0]}`);\n}\n\nconst PaintType = {\n COLORED: 1,\n UNCOLORED: 2,\n};\n\nclass TilingPattern {\n // 10in @ 300dpi shall be enough.\n static MAX_PATTERN_SIZE = 3000;\n\n constructor(IR, ctx, canvasGraphicsFactory, baseTransform) {\n this.color = IR[1];\n this.operatorList = IR[2];\n this.matrix = IR[3];\n this.bbox = IR[4];\n this.xstep = IR[5];\n this.ystep = IR[6];\n this.paintType = IR[7];\n this.tilingType = IR[8];\n this.ctx = ctx;\n this.canvasGraphicsFactory = canvasGraphicsFactory;\n this.baseTransform = baseTransform;\n }\n\n createPatternCanvas(owner, opIdx) {\n const {\n bbox,\n operatorList,\n paintType,\n tilingType,\n color,\n canvasGraphicsFactory,\n } = this;\n let { xstep, ystep } = this;\n xstep = Math.abs(xstep);\n ystep = Math.abs(ystep);\n\n info(\"TilingType: \" + tilingType);\n\n // A tiling pattern as defined by PDF spec 8.7.2 is a cell whose size is\n // described by bbox, and may repeat regularly by shifting the cell by\n // xstep and ystep.\n // Because the HTML5 canvas API does not support pattern repetition with\n // gaps in between, we use the xstep/ystep instead of the bbox's size.\n //\n // This has the following consequences (similarly for ystep):\n //\n // - If xstep is the same as bbox, then there is no observable difference.\n //\n // - If xstep is larger than bbox, then the pattern canvas is partially\n // empty: the area bounded by bbox is painted, the outside area is void.\n //\n // - If xstep is smaller than bbox, then the pixels between xstep and the\n // bbox boundary will be missing. This is INCORRECT behavior.\n // \"Figures on adjacent tiles should not overlap\" (PDF spec 8.7.3.1),\n // but overlapping cells without common pixels are still valid.\n\n const x0 = bbox[0],\n y0 = bbox[1],\n x1 = bbox[2],\n y1 = bbox[3];\n const width = x1 - x0;\n const height = y1 - y0;\n\n // Obtain scale from matrix and current transformation matrix.\n const scale = new Float32Array(2);\n Util.singularValueDecompose2dScale(this.matrix, scale);\n const [matrixScaleX, matrixScaleY] = scale;\n Util.singularValueDecompose2dScale(this.baseTransform, scale);\n const combinedScaleX = matrixScaleX * scale[0];\n const combinedScaleY = matrixScaleY * scale[1];\n\n let canvasWidth = width,\n canvasHeight = height,\n redrawHorizontally = false,\n redrawVertically = false;\n\n const xScaledStep = Math.ceil(xstep * combinedScaleX);\n const yScaledStep = Math.ceil(ystep * combinedScaleY);\n const xScaledWidth = Math.ceil(width * combinedScaleX);\n const yScaledHeight = Math.ceil(height * combinedScaleY);\n\n if (xScaledStep >= xScaledWidth) {\n canvasWidth = xstep;\n } else {\n redrawHorizontally = true;\n }\n if (yScaledStep >= yScaledHeight) {\n canvasHeight = ystep;\n } else {\n redrawVertically = true;\n }\n\n // Use width and height values that are as close as possible to the end\n // result when the pattern is used. Too low value makes the pattern look\n // blurry. Too large value makes it look too crispy.\n const dimx = this.getSizeAndScale(\n canvasWidth,\n this.ctx.canvas.width,\n combinedScaleX\n );\n const dimy = this.getSizeAndScale(\n canvasHeight,\n this.ctx.canvas.height,\n combinedScaleY\n );\n\n const tmpCanvas = owner.cachedCanvases.getCanvas(\n \"pattern\",\n dimx.size,\n dimy.size\n );\n const tmpCtx = tmpCanvas.context;\n const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx, opIdx);\n graphics.groupLevel = owner.groupLevel;\n\n this.setFillAndStrokeStyleToContext(graphics, paintType, color);\n\n tmpCtx.translate(-dimx.scale * x0, -dimy.scale * y0);\n graphics.transform(\n // We pass 0 as the 'opIdx' argument, but the value is irrelevant.\n // We know that we are in a 'CanvasNestedDependencyTracker' that captures\n // all the sub-operations needed to create this pattern canvas and uses\n // the top-level operation index as their index.\n 0,\n dimx.scale,\n 0,\n 0,\n dimy.scale,\n 0,\n 0\n );\n\n // To match CanvasGraphics beginDrawing we must save the context here or\n // else we end up with unbalanced save/restores.\n tmpCtx.save();\n graphics.dependencyTracker?.save();\n\n this.clipBbox(graphics, x0, y0, x1, y1);\n\n graphics.baseTransform = getCurrentTransform(graphics.ctx);\n\n graphics.executeOperatorList(operatorList);\n\n graphics.endDrawing();\n\n graphics.dependencyTracker?.restore();\n tmpCtx.restore();\n\n if (redrawHorizontally || redrawVertically) {\n // The tile is overlapping itself, so we create a new tile with\n // dimensions xstep * ystep.\n // Then we draw the overlapping parts of the original tile on the new\n // tile.\n // Just as a side note, the code here works correctly even if we don't\n // have to redraw the tile horizontally or vertically. In that case, the\n // original tile is drawn on the new tile only once, but it's useless.\n const image = tmpCanvas.canvas;\n if (redrawHorizontally) {\n canvasWidth = xstep;\n }\n if (redrawVertically) {\n canvasHeight = ystep;\n }\n\n const dimx2 = this.getSizeAndScale(\n canvasWidth,\n this.ctx.canvas.width,\n combinedScaleX\n );\n const dimy2 = this.getSizeAndScale(\n canvasHeight,\n this.ctx.canvas.height,\n combinedScaleY\n );\n\n const xSize = dimx2.size;\n const ySize = dimy2.size;\n const tmpCanvas2 = owner.cachedCanvases.getCanvas(\n \"pattern-workaround\",\n xSize,\n ySize\n );\n const tmpCtx2 = tmpCanvas2.context;\n const ii = redrawHorizontally ? Math.floor(width / xstep) : 0;\n const jj = redrawVertically ? Math.floor(height / ystep) : 0;\n\n // Draw the overlapping parts of the original tile on the new tile.\n for (let i = 0; i <= ii; i++) {\n for (let j = 0; j <= jj; j++) {\n tmpCtx2.drawImage(\n image,\n xSize * i,\n ySize * j,\n xSize,\n ySize,\n 0,\n 0,\n xSize,\n ySize\n );\n }\n }\n return {\n canvas: tmpCanvas2.canvas,\n scaleX: dimx2.scale,\n scaleY: dimy2.scale,\n offsetX: x0,\n offsetY: y0,\n };\n }\n\n return {\n canvas: tmpCanvas.canvas,\n scaleX: dimx.scale,\n scaleY: dimy.scale,\n offsetX: x0,\n offsetY: y0,\n };\n }\n\n getSizeAndScale(step, realOutputSize, scale) {\n // MAX_PATTERN_SIZE is used to avoid OOM situation.\n // Use the destination canvas's size if it is bigger than the hard-coded\n // limit of MAX_PATTERN_SIZE to avoid clipping patterns that cover the\n // whole canvas.\n const maxSize = Math.max(TilingPattern.MAX_PATTERN_SIZE, realOutputSize);\n let size = Math.ceil(step * scale);\n if (size >= maxSize) {\n size = maxSize;\n } else {\n scale = size / step;\n }\n return { scale, size };\n }\n\n clipBbox(graphics, x0, y0, x1, y1) {\n const bboxWidth = x1 - x0;\n const bboxHeight = y1 - y0;\n graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);\n Util.axialAlignedBoundingBox(\n [x0, y0, x1, y1],\n getCurrentTransform(graphics.ctx),\n graphics.current.minMax\n );\n graphics.clip();\n graphics.endPath();\n }\n\n setFillAndStrokeStyleToContext(graphics, paintType, color) {\n const context = graphics.ctx,\n current = graphics.current;\n switch (paintType) {\n case PaintType.COLORED:\n const { fillStyle, strokeStyle } = this.ctx;\n context.fillStyle = current.fillColor = fillStyle;\n context.strokeStyle = current.strokeColor = strokeStyle;\n break;\n case PaintType.UNCOLORED:\n context.fillStyle = context.strokeStyle = color;\n // Set color needed by image masks (fixes issues 3226 and 8741).\n current.fillColor = current.strokeColor = color;\n break;\n default:\n throw new FormatError(`Unsupported paint type: ${paintType}`);\n }\n }\n\n isModifyingCurrentTransform() {\n return false;\n }\n\n getPattern(ctx, owner, inverse, pathType, opIdx) {\n // PDF spec 8.7.2 NOTE 1: pattern's matrix is relative to initial matrix.\n let matrix = inverse;\n if (pathType !== PathType.SHADING) {\n matrix = Util.transform(matrix, owner.baseTransform);\n if (this.matrix) {\n matrix = Util.transform(matrix, this.matrix);\n }\n }\n\n const temporaryPatternCanvas = this.createPatternCanvas(owner, opIdx);\n\n let domMatrix = new DOMMatrix(matrix);\n // Rescale and so that the ctx.createPattern call generates a pattern with\n // the desired size.\n domMatrix = domMatrix.translate(\n temporaryPatternCanvas.offsetX,\n temporaryPatternCanvas.offsetY\n );\n domMatrix = domMatrix.scale(\n 1 / temporaryPatternCanvas.scaleX,\n 1 / temporaryPatternCanvas.scaleY\n );\n\n const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, \"repeat\");\n pattern.setTransform(domMatrix);\n\n return pattern;\n }\n}\n\nexport { getShadingPattern, PathType, TilingPattern };\n","/* Copyright 2022 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\nimport { FeatureTest, ImageKind } from \"./util.js\";\n\nfunction convertToRGBA(params) {\n switch (params.kind) {\n case ImageKind.GRAYSCALE_1BPP:\n return convertBlackAndWhiteToRGBA(params);\n case ImageKind.RGB_24BPP:\n return convertRGBToRGBA(params);\n }\n\n return null;\n}\n\nfunction convertBlackAndWhiteToRGBA({\n src,\n srcPos = 0,\n dest,\n width,\n height,\n nonBlackColor = 0xffffffff,\n inverseDecode = false,\n}) {\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n const [zeroMapping, oneMapping] = inverseDecode\n ? [nonBlackColor, black]\n : [black, nonBlackColor];\n const widthInSource = width >> 3;\n const widthRemainder = width & 7;\n const srcLength = src.length;\n dest = new Uint32Array(dest.buffer);\n let destPos = 0;\n\n for (let i = 0; i < height; i++) {\n for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {\n const elem = srcPos < srcLength ? src[srcPos] : 255;\n dest[destPos++] = elem & 0b10000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1000 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b100 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b10 ? oneMapping : zeroMapping;\n dest[destPos++] = elem & 0b1 ? oneMapping : zeroMapping;\n }\n if (widthRemainder === 0) {\n continue;\n }\n const elem = srcPos < srcLength ? src[srcPos++] : 255;\n for (let j = 0; j < widthRemainder; j++) {\n dest[destPos++] = elem & (1 << (7 - j)) ? oneMapping : zeroMapping;\n }\n }\n return { srcPos, destPos };\n}\n\nfunction convertRGBToRGBA({\n src,\n srcPos = 0,\n dest,\n destPos = 0,\n width,\n height,\n}) {\n let i = 0;\n const len = width * height * 3;\n const len32 = len >> 2;\n const src32 = new Uint32Array(src.buffer, srcPos, len32);\n\n if (FeatureTest.isLittleEndian) {\n // It's a way faster to do the shuffle manually instead of working\n // component by component with some Uint8 arrays.\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R2B1G1R1\n const s2 = src32[i + 1]; // G3R3B2G2\n const s3 = src32[i + 2]; // B4G4R4B3\n\n dest[destPos] = s1 | 0xff000000;\n dest[destPos + 1] = (s1 >>> 24) | (s2 << 8) | 0xff000000;\n dest[destPos + 2] = (s2 >>> 16) | (s3 << 16) | 0xff000000;\n dest[destPos + 3] = (s3 >>> 8) | 0xff000000;\n }\n\n for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n dest[destPos++] =\n src[j] | (src[j + 1] << 8) | (src[j + 2] << 16) | 0xff000000;\n }\n } else {\n for (; i < len32 - 2; i += 3, destPos += 4) {\n const s1 = src32[i]; // R1G1B1R2\n const s2 = src32[i + 1]; // G2B2R3G3\n const s3 = src32[i + 2]; // B3R4G4B4\n\n dest[destPos] = s1 | 0xff;\n dest[destPos + 1] = (s1 << 24) | (s2 >>> 8) | 0xff;\n dest[destPos + 2] = (s2 << 16) | (s3 >>> 16) | 0xff;\n dest[destPos + 3] = (s3 << 8) | 0xff;\n }\n\n for (let j = i * 4, jj = srcPos + len; j < jj; j += 3) {\n dest[destPos++] =\n (src[j] << 24) | (src[j + 1] << 16) | (src[j + 2] << 8) | 0xff;\n }\n }\n\n return { srcPos: srcPos + len, destPos };\n}\n\nfunction grayToRGBA(src, dest) {\n if (FeatureTest.isLittleEndian) {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x10101) | 0xff000000;\n }\n } else {\n for (let i = 0, ii = src.length; i < ii; i++) {\n dest[i] = (src[i] * 0x1010100) | 0x000000ff;\n }\n }\n}\n\nexport { convertBlackAndWhiteToRGBA, convertToRGBA, grayToRGBA };\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\nimport {\n CanvasNestedDependencyTracker,\n Dependencies,\n} from \"./canvas_dependency_tracker.js\";\nimport {\n DrawOPS,\n FeatureTest,\n FONT_IDENTITY_MATRIX,\n ImageKind,\n info,\n OPS,\n shadow,\n TextRenderingMode,\n unreachable,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport {\n getCurrentTransform,\n getCurrentTransformInverse,\n OutputScale,\n PixelsPerInch,\n} from \"./display_utils.js\";\nimport {\n getShadingPattern,\n PathType,\n TilingPattern,\n} from \"./pattern_helper.js\";\nimport { convertBlackAndWhiteToRGBA } from \"../shared/image_utils.js\";\n\n// contexts store most of the state we need natively.\n// However, PDF needs a bit more state, which we store here.\n// Minimal font size that would be used during canvas fillText operations.\nconst MIN_FONT_SIZE = 16;\n// Maximum font size that would be used during canvas fillText operations.\nconst MAX_FONT_SIZE = 100;\n\n// Defines the time the `executeOperatorList`-method is going to be executing\n// before it stops and schedules a continue of execution.\nconst EXECUTION_TIME = 15; // ms\n// Defines the number of steps before checking the execution time.\nconst EXECUTION_STEPS = 10;\n\nconst FULL_CHUNK_HEIGHT = 16;\n\n// Only used in rescaleAndStroke. The goal is to avoid\n// creating a new DOMMatrix object each time we need it.\nconst SCALE_MATRIX = new DOMMatrix();\n\n// Used to get some coordinates.\nconst XY = new Float32Array(2);\n\n// Initial rectangle values for the minMax array.\nconst MIN_MAX_INIT = new Float32Array([\n Infinity,\n Infinity,\n -Infinity,\n -Infinity,\n]);\n\n/**\n * Overrides certain methods on a 2d ctx so that when they are called they\n * will also call the same method on the destCtx. The methods that are\n * overridden are all the transformation state modifiers, path creation, and\n * save/restore. We only forward these specific methods because they are the\n * only state modifiers that we cannot copy over when we switch contexts.\n *\n * To remove mirroring call `ctx._removeMirroring()`.\n *\n * @param {Object} ctx - The 2d canvas context that will duplicate its calls on\n * the destCtx.\n * @param {Object} destCtx - The 2d canvas context that will receive the\n * forwarded calls.\n */\nfunction mirrorContextOperations(ctx, destCtx) {\n if (ctx._removeMirroring) {\n throw new Error(\"Context is already forwarding operations.\");\n }\n ctx.__originalSave = ctx.save;\n ctx.__originalRestore = ctx.restore;\n ctx.__originalRotate = ctx.rotate;\n ctx.__originalScale = ctx.scale;\n ctx.__originalTranslate = ctx.translate;\n ctx.__originalTransform = ctx.transform;\n ctx.__originalSetTransform = ctx.setTransform;\n ctx.__originalResetTransform = ctx.resetTransform;\n ctx.__originalClip = ctx.clip;\n ctx.__originalMoveTo = ctx.moveTo;\n ctx.__originalLineTo = ctx.lineTo;\n ctx.__originalBezierCurveTo = ctx.bezierCurveTo;\n ctx.__originalRect = ctx.rect;\n ctx.__originalClosePath = ctx.closePath;\n ctx.__originalBeginPath = ctx.beginPath;\n\n ctx._removeMirroring = () => {\n ctx.save = ctx.__originalSave;\n ctx.restore = ctx.__originalRestore;\n ctx.rotate = ctx.__originalRotate;\n ctx.scale = ctx.__originalScale;\n ctx.translate = ctx.__originalTranslate;\n ctx.transform = ctx.__originalTransform;\n ctx.setTransform = ctx.__originalSetTransform;\n ctx.resetTransform = ctx.__originalResetTransform;\n\n ctx.clip = ctx.__originalClip;\n ctx.moveTo = ctx.__originalMoveTo;\n ctx.lineTo = ctx.__originalLineTo;\n ctx.bezierCurveTo = ctx.__originalBezierCurveTo;\n ctx.rect = ctx.__originalRect;\n ctx.closePath = ctx.__originalClosePath;\n ctx.beginPath = ctx.__originalBeginPath;\n delete ctx._removeMirroring;\n };\n\n ctx.save = function () {\n destCtx.save();\n this.__originalSave();\n };\n\n ctx.restore = function () {\n destCtx.restore();\n this.__originalRestore();\n };\n\n ctx.translate = function (x, y) {\n destCtx.translate(x, y);\n this.__originalTranslate(x, y);\n };\n\n ctx.scale = function (x, y) {\n destCtx.scale(x, y);\n this.__originalScale(x, y);\n };\n\n ctx.transform = function (a, b, c, d, e, f) {\n destCtx.transform(a, b, c, d, e, f);\n this.__originalTransform(a, b, c, d, e, f);\n };\n\n ctx.setTransform = function (a, b, c, d, e, f) {\n destCtx.setTransform(a, b, c, d, e, f);\n this.__originalSetTransform(a, b, c, d, e, f);\n };\n\n ctx.resetTransform = function () {\n destCtx.resetTransform();\n this.__originalResetTransform();\n };\n\n ctx.rotate = function (angle) {\n destCtx.rotate(angle);\n this.__originalRotate(angle);\n };\n\n ctx.clip = function (rule) {\n destCtx.clip(rule);\n this.__originalClip(rule);\n };\n\n ctx.moveTo = function (x, y) {\n destCtx.moveTo(x, y);\n this.__originalMoveTo(x, y);\n };\n\n ctx.lineTo = function (x, y) {\n destCtx.lineTo(x, y);\n this.__originalLineTo(x, y);\n };\n\n ctx.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {\n destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);\n };\n\n ctx.rect = function (x, y, width, height) {\n destCtx.rect(x, y, width, height);\n this.__originalRect(x, y, width, height);\n };\n\n ctx.closePath = function () {\n destCtx.closePath();\n this.__originalClosePath();\n };\n\n ctx.beginPath = function () {\n destCtx.beginPath();\n this.__originalBeginPath();\n };\n}\n\nclass CachedCanvases {\n constructor(canvasFactory) {\n this.canvasFactory = canvasFactory;\n this.cache = Object.create(null);\n }\n\n getCanvas(id, width, height) {\n let canvasEntry;\n if (this.cache[id] !== undefined) {\n canvasEntry = this.cache[id];\n this.canvasFactory.reset(canvasEntry, width, height);\n } else {\n canvasEntry = this.canvasFactory.create(width, height);\n this.cache[id] = canvasEntry;\n }\n return canvasEntry;\n }\n\n delete(id) {\n delete this.cache[id];\n }\n\n clear() {\n for (const id in this.cache) {\n const canvasEntry = this.cache[id];\n this.canvasFactory.destroy(canvasEntry);\n delete this.cache[id];\n }\n }\n}\n\nfunction drawImageAtIntegerCoords(\n ctx,\n srcImg,\n srcX,\n srcY,\n srcW,\n srcH,\n destX,\n destY,\n destW,\n destH\n) {\n const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);\n if (b === 0 && c === 0) {\n // top-left corner is at (X, Y) and\n // bottom-right one is at (X + width, Y + height).\n\n // If leftX is 4.321 then it's rounded to 4.\n // If width is 10.432 then it's rounded to 11 because\n // rightX = leftX + width = 14.753 which is rounded to 15\n // so after rounding the total width is 11 (15 - 4).\n // It's why we can't just floor/ceil uniformly, it just depends\n // on the values we've.\n\n const tlX = destX * a + tx;\n const rTlX = Math.round(tlX);\n const tlY = destY * d + ty;\n const rTlY = Math.round(tlY);\n const brX = (destX + destW) * a + tx;\n\n // Some pdf contains images with 1x1 images so in case of 0-width after\n // scaling we must fallback on 1 to be sure there is something.\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destY + destH) * d + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n // We must apply a transformation in order to apply it on the image itself.\n // For example if a == 1 && d == -1, it means that the image itself is\n // mirrored w.r.t. the x-axis.\n ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rWidth, rHeight];\n }\n\n if (a === 0 && d === 0) {\n // This path is taken in issue9462.pdf (page 3).\n const tlX = destY * c + tx;\n const rTlX = Math.round(tlX);\n const tlY = destX * b + ty;\n const rTlY = Math.round(tlY);\n const brX = (destY + destH) * c + tx;\n const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;\n const brY = (destX + destW) * b + ty;\n const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;\n\n ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);\n ctx.setTransform(a, b, c, d, tx, ty);\n\n return [rHeight, rWidth];\n }\n\n // Not a scale matrix so let the render handle the case without rounding.\n ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);\n\n const scaleX = Math.hypot(a, b);\n const scaleY = Math.hypot(c, d);\n return [scaleX * destW, scaleY * destH];\n}\n\nclass CanvasExtraState {\n // Are soft masks and alpha values shapes or opacities?\n alphaIsShape = false;\n\n fontSize = 0;\n\n fontSizeScale = 1;\n\n textMatrix = null;\n\n textMatrixScale = 1;\n\n fontMatrix = FONT_IDENTITY_MATRIX;\n\n leading = 0;\n\n // Current point (in user coordinates)\n x = 0;\n\n y = 0;\n\n // Start of text line (in text coordinates)\n lineX = 0;\n\n lineY = 0;\n\n // Character and word spacing\n charSpacing = 0;\n\n wordSpacing = 0;\n\n textHScale = 1;\n\n textRenderingMode = TextRenderingMode.FILL;\n\n textRise = 0;\n\n // Default fore and background colors\n fillColor = \"#000000\";\n\n strokeColor = \"#000000\";\n\n patternFill = false;\n\n patternStroke = false;\n\n // Note: fill alpha applies to all non-stroking operations\n fillAlpha = 1;\n\n strokeAlpha = 1;\n\n lineWidth = 1;\n\n activeSMask = null;\n\n transferMaps = \"none\";\n\n constructor(width, height, preInit) {\n preInit?.(this);\n\n this.clipBox = new Float32Array([0, 0, width, height]);\n this.minMax = MIN_MAX_INIT.slice();\n }\n\n clone() {\n const clone = Object.create(this);\n clone.clipBox = this.clipBox.slice();\n clone.minMax = this.minMax.slice();\n return clone;\n }\n\n getPathBoundingBox(pathType = PathType.FILL, transform = null) {\n const box = this.minMax.slice();\n if (pathType === PathType.STROKE) {\n if (!transform) {\n unreachable(\"Stroke bounding box must include transform.\");\n }\n // Stroked paths can be outside of the path bounding box by 1/2 the line\n // width.\n Util.singularValueDecompose2dScale(transform, XY);\n const xStrokePad = (XY[0] * this.lineWidth) / 2;\n const yStrokePad = (XY[1] * this.lineWidth) / 2;\n box[0] -= xStrokePad;\n box[1] -= yStrokePad;\n box[2] += xStrokePad;\n box[3] += yStrokePad;\n }\n return box;\n }\n\n updateClipFromPath() {\n const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());\n this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);\n }\n\n isEmptyClip() {\n return this.minMax[0] === Infinity;\n }\n\n startNewPathAndClipBox(box) {\n this.clipBox.set(box, 0);\n this.minMax.set(MIN_MAX_INIT, 0);\n }\n\n getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {\n return Util.intersect(\n this.clipBox,\n this.getPathBoundingBox(pathType, transform)\n );\n }\n}\n\nfunction putBinaryImageData(ctx, imgData) {\n if (imgData instanceof ImageData) {\n ctx.putImageData(imgData, 0, 0);\n return;\n }\n\n // Put the image data to the canvas in chunks, rather than putting the\n // whole image at once. This saves JS memory, because the ImageData object\n // is smaller. It also possibly saves C++ memory within the implementation\n // of putImageData(). (E.g. in Firefox we make two short-lived copies of\n // the data passed to putImageData()). |n| shouldn't be too small, however,\n // because too many putImageData() calls will slow things down.\n //\n // Note: as written, if the last chunk is partial, the putImageData() call\n // will (conceptually) put pixels past the bounds of the canvas. But\n // that's ok; any such pixels are ignored.\n\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0,\n destPos;\n const src = imgData.data;\n const dest = chunkImgData.data;\n let i, j, thisChunkHeight, elemsInThisChunk;\n\n // There are multiple forms in which the pixel data can be passed, and\n // imgData.kind tells us which one this is.\n if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {\n // Grayscale, 1 bit per pixel (i.e. black-and-white).\n const srcLength = src.byteLength;\n const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);\n const dest32DataLength = dest32.length;\n const fullSrcDiff = (width + 7) >> 3;\n const white = 0xffffffff;\n const black = FeatureTest.isLittleEndian ? 0xff000000 : 0x000000ff;\n\n for (i = 0; i < totalChunks; i++) {\n thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n destPos = 0;\n for (j = 0; j < thisChunkHeight; j++) {\n const srcDiff = srcLength - srcPos;\n let k = 0;\n const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;\n const kEndUnrolled = kEnd & ~7;\n let mask = 0;\n let srcByte = 0;\n for (; k < kEndUnrolled; k += 8) {\n srcByte = src[srcPos++];\n dest32[destPos++] = srcByte & 128 ? white : black;\n dest32[destPos++] = srcByte & 64 ? white : black;\n dest32[destPos++] = srcByte & 32 ? white : black;\n dest32[destPos++] = srcByte & 16 ? white : black;\n dest32[destPos++] = srcByte & 8 ? white : black;\n dest32[destPos++] = srcByte & 4 ? white : black;\n dest32[destPos++] = srcByte & 2 ? white : black;\n dest32[destPos++] = srcByte & 1 ? white : black;\n }\n for (; k < kEnd; k++) {\n if (mask === 0) {\n srcByte = src[srcPos++];\n mask = 128;\n }\n\n dest32[destPos++] = srcByte & mask ? white : black;\n mask >>= 1;\n }\n }\n // We ran out of input. Make all remaining pixels transparent.\n while (destPos < dest32DataLength) {\n dest32[destPos++] = 0;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else if (imgData.kind === ImageKind.RGBA_32BPP) {\n // RGBA, 32-bits per pixel.\n j = 0;\n elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;\n for (i = 0; i < fullChunks; i++) {\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n srcPos += elemsInThisChunk;\n\n ctx.putImageData(chunkImgData, 0, j);\n j += FULL_CHUNK_HEIGHT;\n }\n if (i < totalChunks) {\n elemsInThisChunk = width * partialChunkHeight * 4;\n dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));\n\n ctx.putImageData(chunkImgData, 0, j);\n }\n } else if (imgData.kind === ImageKind.RGB_24BPP) {\n // RGB, 24-bits per pixel.\n thisChunkHeight = FULL_CHUNK_HEIGHT;\n elemsInThisChunk = width * thisChunkHeight;\n for (i = 0; i < totalChunks; i++) {\n if (i >= fullChunks) {\n thisChunkHeight = partialChunkHeight;\n elemsInThisChunk = width * thisChunkHeight;\n }\n\n destPos = 0;\n for (j = elemsInThisChunk; j--; ) {\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = src[srcPos++];\n dest[destPos++] = 255;\n }\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n } else {\n throw new Error(`bad image kind: ${imgData.kind}`);\n }\n}\n\nfunction putBinaryImageMask(ctx, imgData) {\n if (imgData.bitmap) {\n // The bitmap has been created in the worker.\n ctx.drawImage(imgData.bitmap, 0, 0);\n return;\n }\n\n // Slow path: OffscreenCanvas isn't available in the worker.\n const height = imgData.height,\n width = imgData.width;\n const partialChunkHeight = height % FULL_CHUNK_HEIGHT;\n const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;\n const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;\n\n const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);\n let srcPos = 0;\n const src = imgData.data;\n const dest = chunkImgData.data;\n\n for (let i = 0; i < totalChunks; i++) {\n const thisChunkHeight =\n i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;\n\n // Expand the mask so it can be used by the canvas. Any required\n // inversion has already been handled.\n\n ({ srcPos } = convertBlackAndWhiteToRGBA({\n src,\n srcPos,\n dest,\n width,\n height: thisChunkHeight,\n nonBlackColor: 0,\n }));\n\n ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);\n }\n}\n\nfunction copyCtxState(sourceCtx, destCtx) {\n const properties = [\n \"strokeStyle\",\n \"fillStyle\",\n \"fillRule\",\n \"globalAlpha\",\n \"lineWidth\",\n \"lineCap\",\n \"lineJoin\",\n \"miterLimit\",\n \"globalCompositeOperation\",\n \"font\",\n \"filter\",\n ];\n for (const property of properties) {\n if (sourceCtx[property] !== undefined) {\n destCtx[property] = sourceCtx[property];\n }\n }\n if (sourceCtx.setLineDash !== undefined) {\n destCtx.setLineDash(sourceCtx.getLineDash());\n destCtx.lineDashOffset = sourceCtx.lineDashOffset;\n }\n}\n\nfunction resetCtxToDefault(ctx) {\n ctx.strokeStyle = ctx.fillStyle = \"#000000\";\n ctx.fillRule = \"nonzero\";\n ctx.globalAlpha = 1;\n ctx.lineWidth = 1;\n ctx.lineCap = \"butt\";\n ctx.lineJoin = \"miter\";\n ctx.miterLimit = 10;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.font = \"10px sans-serif\";\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash([]);\n ctx.lineDashOffset = 0;\n }\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n}\n\nfunction getImageSmoothingEnabled(transform, interpolate) {\n // In section 8.9.5.3 of the PDF spec, it's mentioned that the interpolate\n // flag should be used when the image is upscaled.\n // In Firefox, smoothing is always used when downscaling images (bug 1360415).\n\n if (interpolate) {\n return true;\n }\n\n Util.singularValueDecompose2dScale(transform, XY);\n // Round to a 32bit float so that `<=` check below will pass for numbers that\n // are very close, but not exactly the same 64bit floats.\n const actualScale = Math.fround(\n OutputScale.pixelRatio * PixelsPerInch.PDF_TO_CSS_UNITS\n );\n // `XY` is a Float32Array.\n return XY[0] <= actualScale && XY[1] <= actualScale;\n}\n\nconst LINE_CAP_STYLES = [\"butt\", \"round\", \"square\"];\nconst LINE_JOIN_STYLES = [\"miter\", \"round\", \"bevel\"];\nconst NORMAL_CLIP = {};\nconst EO_CLIP = {};\n\nclass CanvasGraphics {\n constructor(\n canvasCtx,\n commonObjs,\n objs,\n canvasFactory,\n filterFactory,\n { optionalContentConfig, markedContentStack = null },\n annotationCanvasMap,\n pageColors,\n dependencyTracker\n ) {\n this.ctx = canvasCtx;\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n this.stateStack = [];\n this.pendingClip = null;\n this.pendingEOFill = false;\n this.res = null;\n this.xobjs = null;\n this.commonObjs = commonObjs;\n this.objs = objs;\n this.canvasFactory = canvasFactory;\n this.filterFactory = filterFactory;\n this.groupStack = [];\n // Patterns are painted relative to the initial page/form transform, see\n // PDF spec 8.7.2 NOTE 1.\n this.baseTransform = null;\n this.baseTransformStack = [];\n this.groupLevel = 0;\n this.smaskStack = [];\n this.smaskCounter = 0;\n this.tempSMask = null;\n this.suspendedCtx = null;\n this.contentVisible = true;\n this.markedContentStack = markedContentStack || [];\n this.optionalContentConfig = optionalContentConfig;\n this.cachedCanvases = new CachedCanvases(this.canvasFactory);\n this.cachedPatterns = new Map();\n this.annotationCanvasMap = annotationCanvasMap;\n this.viewportScale = 1;\n this.outputScaleX = 1;\n this.outputScaleY = 1;\n this.pageColors = pageColors;\n\n this._cachedScaleForStroking = [-1, 0];\n this._cachedGetSinglePixelWidth = null;\n this._cachedBitmapsMap = new Map();\n\n this.dependencyTracker = dependencyTracker ?? null;\n }\n\n getObject(opIdx, data, fallback = null) {\n if (typeof data === \"string\") {\n this.dependencyTracker?.recordNamedDependency(opIdx, data);\n return data.startsWith(\"g_\")\n ? this.commonObjs.get(data)\n : this.objs.get(data);\n }\n return fallback;\n }\n\n beginDrawing({\n transform,\n viewport,\n transparency = false,\n background = null,\n }) {\n // For pdfs that use blend modes we have to clear the canvas else certain\n // blend modes can look wrong since we'd be blending with a white\n // backdrop. The problem with a transparent backdrop though is we then\n // don't get sub pixel anti aliasing on text, creating temporary\n // transparent canvas when we have blend modes.\n const width = this.ctx.canvas.width;\n const height = this.ctx.canvas.height;\n\n const savedFillStyle = this.ctx.fillStyle;\n this.ctx.fillStyle = background || \"#ffffff\";\n this.ctx.fillRect(0, 0, width, height);\n this.ctx.fillStyle = savedFillStyle;\n\n if (transparency) {\n const transparentCanvas = this.cachedCanvases.getCanvas(\n \"transparent\",\n width,\n height\n );\n this.compositeCtx = this.ctx;\n this.transparentCanvas = transparentCanvas.canvas;\n this.ctx = transparentCanvas.context;\n this.ctx.save();\n // The transform can be applied before rendering, transferring it to\n // the new canvas.\n this.ctx.transform(...getCurrentTransform(this.compositeCtx));\n }\n\n this.ctx.save();\n resetCtxToDefault(this.ctx);\n if (transform) {\n this.ctx.transform(...transform);\n this.outputScaleX = transform[0];\n this.outputScaleY = transform[0];\n }\n this.ctx.transform(...viewport.transform);\n this.viewportScale = viewport.scale;\n\n this.baseTransform = getCurrentTransform(this.ctx);\n }\n\n executeOperatorList(\n operatorList,\n executionStartIdx,\n continueCallback,\n stepper,\n operationsFilter\n ) {\n const argsArray = operatorList.argsArray;\n const fnArray = operatorList.fnArray;\n let i = executionStartIdx || 0;\n const argsArrayLen = argsArray.length;\n\n // Sometimes the OperatorList to execute is empty.\n if (argsArrayLen === i) {\n return i;\n }\n\n const chunkOperations =\n argsArrayLen - i > EXECUTION_STEPS &&\n typeof continueCallback === \"function\";\n const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;\n let steps = 0;\n\n const commonObjs = this.commonObjs;\n const objs = this.objs;\n let fnId, fnArgs;\n\n while (true) {\n if (stepper !== undefined && i === stepper.nextBreakPoint) {\n stepper.breakIt(i, continueCallback);\n return i;\n }\n\n if (!operationsFilter || operationsFilter(i)) {\n fnId = fnArray[i];\n // TODO: There is a `undefined` coming from somewhere.\n fnArgs = argsArray[i] ?? null;\n\n if (fnId !== OPS.dependency) {\n if (fnArgs === null) {\n this[fnId](i);\n } else {\n this[fnId](i, ...fnArgs);\n }\n } else {\n for (const depObjId of fnArgs) {\n this.dependencyTracker?.recordNamedData(depObjId, i);\n const objsPool = depObjId.startsWith(\"g_\") ? commonObjs : objs;\n\n // If the promise isn't resolved yet, add the continueCallback\n // to the promise and bail out.\n if (!objsPool.has(depObjId)) {\n objsPool.get(depObjId, continueCallback);\n return i;\n }\n }\n }\n }\n\n i++;\n\n // If the entire operatorList was executed, stop as were done.\n if (i === argsArrayLen) {\n return i;\n }\n\n // If the execution took longer then a certain amount of time and\n // `continueCallback` is specified, interrupt the execution.\n if (chunkOperations && ++steps > EXECUTION_STEPS) {\n if (Date.now() > endTime) {\n continueCallback();\n return i;\n }\n steps = 0;\n }\n\n // If the operatorList isn't executed completely yet OR the execution\n // time was short enough, do another execution round.\n }\n }\n\n #restoreInitialState() {\n // Finishing all opened operations such as SMask group painting.\n while (this.stateStack.length || this.inSMaskMode) {\n this.restore();\n }\n\n this.current.activeSMask = null;\n this.ctx.restore();\n\n if (this.transparentCanvas) {\n this.ctx = this.compositeCtx;\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0); // Avoid apply transform twice\n this.ctx.drawImage(this.transparentCanvas, 0, 0);\n this.ctx.restore();\n this.transparentCanvas = null;\n }\n }\n\n endDrawing() {\n this.#restoreInitialState();\n\n this.cachedCanvases.clear();\n this.cachedPatterns.clear();\n\n for (const cache of this._cachedBitmapsMap.values()) {\n for (const canvas of cache.values()) {\n if (\n typeof HTMLCanvasElement !== \"undefined\" &&\n canvas instanceof HTMLCanvasElement\n ) {\n canvas.width = canvas.height = 0;\n }\n }\n cache.clear();\n }\n this._cachedBitmapsMap.clear();\n this.#drawFilter();\n }\n\n #drawFilter() {\n if (this.pageColors) {\n const hcmFilterId = this.filterFactory.addHCMFilter(\n this.pageColors.foreground,\n this.pageColors.background\n );\n if (hcmFilterId !== \"none\") {\n const savedFilter = this.ctx.filter;\n this.ctx.filter = hcmFilterId;\n this.ctx.drawImage(this.ctx.canvas, 0, 0);\n this.ctx.filter = savedFilter;\n }\n }\n }\n\n _scaleImage(img, inverseTransform) {\n // Vertical or horizontal scaling shall not be more than 2 to not lose the\n // pixels during drawImage operation, painting on the temporary canvas(es)\n // that are twice smaller in size.\n\n // displayWidth and displayHeight are used for VideoFrame.\n const width = img.width ?? img.displayWidth;\n const height = img.height ?? img.displayHeight;\n let widthScale = Math.max(\n Math.hypot(inverseTransform[0], inverseTransform[1]),\n 1\n );\n let heightScale = Math.max(\n Math.hypot(inverseTransform[2], inverseTransform[3]),\n 1\n );\n\n let paintWidth = width,\n paintHeight = height;\n let tmpCanvasId = \"prescale1\";\n let tmpCanvas, tmpCtx;\n while (\n (widthScale > 2 && paintWidth > 1) ||\n (heightScale > 2 && paintHeight > 1)\n ) {\n let newWidth = paintWidth,\n newHeight = paintHeight;\n if (widthScale > 2 && paintWidth > 1) {\n // See bug 1820511 (Windows specific bug).\n // TODO: once the above bug is fixed we could revert to:\n // newWidth = Math.ceil(paintWidth / 2);\n newWidth =\n paintWidth >= 16384\n ? Math.floor(paintWidth / 2) - 1 || 1\n : Math.ceil(paintWidth / 2);\n widthScale /= paintWidth / newWidth;\n }\n if (heightScale > 2 && paintHeight > 1) {\n // TODO: see the comment above.\n newHeight =\n paintHeight >= 16384\n ? Math.floor(paintHeight / 2) - 1 || 1\n : Math.ceil(paintHeight) / 2;\n heightScale /= paintHeight / newHeight;\n }\n tmpCanvas = this.cachedCanvases.getCanvas(\n tmpCanvasId,\n newWidth,\n newHeight\n );\n tmpCtx = tmpCanvas.context;\n tmpCtx.clearRect(0, 0, newWidth, newHeight);\n tmpCtx.drawImage(\n img,\n 0,\n 0,\n paintWidth,\n paintHeight,\n 0,\n 0,\n newWidth,\n newHeight\n );\n img = tmpCanvas.canvas;\n paintWidth = newWidth;\n paintHeight = newHeight;\n tmpCanvasId = tmpCanvasId === \"prescale1\" ? \"prescale2\" : \"prescale1\";\n }\n return {\n img,\n paintWidth,\n paintHeight,\n };\n }\n\n _createMaskCanvas(opIdx, img) {\n const ctx = this.ctx;\n const { width, height } = img;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n const currentTransform = getCurrentTransform(ctx);\n\n let cache, cacheKey, scaled, maskCanvas;\n if ((img.bitmap || img.data) && img.count > 1) {\n const mainKey = img.bitmap || img.data.buffer;\n // We're reusing the same image several times, so we can cache it.\n // In case we've a pattern fill we just keep the scaled version of\n // the image.\n // Only the scaling part matters, the translation part is just used\n // to compute offsets (but not when filling patterns see #15573).\n // TODO: handle the case of a pattern fill if it's possible.\n cacheKey = JSON.stringify(\n isPatternFill\n ? currentTransform\n : [currentTransform.slice(0, 4), fillColor]\n );\n\n cache = this._cachedBitmapsMap.get(mainKey);\n if (!cache) {\n cache = new Map();\n this._cachedBitmapsMap.set(mainKey, cache);\n }\n const cachedImage = cache.get(cacheKey);\n if (cachedImage && !isPatternFill) {\n const offsetX = Math.round(\n Math.min(currentTransform[0], currentTransform[2]) +\n currentTransform[4]\n );\n const offsetY = Math.round(\n Math.min(currentTransform[1], currentTransform[3]) +\n currentTransform[5]\n );\n\n this.dependencyTracker?.recordDependencies(\n opIdx,\n Dependencies.transformAndFill\n );\n return {\n canvas: cachedImage,\n offsetX,\n offsetY,\n };\n }\n scaled = cachedImage;\n }\n\n if (!scaled) {\n maskCanvas = this.cachedCanvases.getCanvas(\"maskCanvas\", width, height);\n putBinaryImageMask(maskCanvas.context, img);\n }\n\n // Create the mask canvas at the size it will be drawn at and also set\n // its transform to match the current transform so if there are any\n // patterns applied they will be applied relative to the correct\n // transform.\n\n let maskToCanvas = Util.transform(currentTransform, [\n 1 / width,\n 0,\n 0,\n -1 / height,\n 0,\n 0,\n ]);\n maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);\n const minMax = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox([0, 0, width, height], maskToCanvas, minMax);\n const [minX, minY, maxX, maxY] = minMax;\n const drawnWidth = Math.round(maxX - minX) || 1;\n const drawnHeight = Math.round(maxY - minY) || 1;\n const fillCanvas = this.cachedCanvases.getCanvas(\n \"fillCanvas\",\n drawnWidth,\n drawnHeight\n );\n const fillCtx = fillCanvas.context;\n\n // The offset will be the top-left coordinate mask.\n // If objToCanvas is [a,b,c,d,e,f] then:\n // - offsetX = min(a, c) + e\n // - offsetY = min(b, d) + f\n const offsetX = minX;\n const offsetY = minY;\n fillCtx.translate(-offsetX, -offsetY);\n fillCtx.transform(...maskToCanvas);\n\n if (!scaled) {\n // Pre-scale if needed to improve image smoothing.\n scaled = this._scaleImage(\n maskCanvas.canvas,\n getCurrentTransformInverse(fillCtx)\n );\n scaled = scaled.img;\n if (cache && isPatternFill) {\n cache.set(cacheKey, scaled);\n }\n }\n\n fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(fillCtx),\n img.interpolate\n );\n\n drawImageAtIntegerCoords(\n fillCtx,\n scaled,\n 0,\n 0,\n scaled.width,\n scaled.height,\n 0,\n 0,\n width,\n height\n );\n fillCtx.globalCompositeOperation = \"source-in\";\n\n const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [\n 1,\n 0,\n 0,\n 1,\n -offsetX,\n -offsetY,\n ]);\n fillCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(ctx, this, inverse, PathType.FILL, opIdx)\n : fillColor;\n\n fillCtx.fillRect(0, 0, width, height);\n\n if (cache && !isPatternFill) {\n // The fill canvas is put in the cache associated to the mask image\n // so we must remove from the cached canvas: it mustn't be used again.\n this.cachedCanvases.delete(\"fillCanvas\");\n cache.set(cacheKey, fillCanvas.canvas);\n }\n\n this.dependencyTracker?.recordDependencies(\n opIdx,\n Dependencies.transformAndFill\n );\n\n // Round the offsets to avoid drawing fractional pixels.\n return {\n canvas: fillCanvas.canvas,\n offsetX: Math.round(offsetX),\n offsetY: Math.round(offsetY),\n };\n }\n\n // Graphics state\n setLineWidth(opIdx, width) {\n this.dependencyTracker?.recordSimpleData(\"lineWidth\", opIdx);\n if (width !== this.current.lineWidth) {\n this._cachedScaleForStroking[0] = -1;\n }\n this.current.lineWidth = width;\n this.ctx.lineWidth = width;\n }\n\n setLineCap(opIdx, style) {\n this.dependencyTracker?.recordSimpleData(\"lineCap\", opIdx);\n this.ctx.lineCap = LINE_CAP_STYLES[style];\n }\n\n setLineJoin(opIdx, style) {\n this.dependencyTracker?.recordSimpleData(\"lineJoin\", opIdx);\n this.ctx.lineJoin = LINE_JOIN_STYLES[style];\n }\n\n setMiterLimit(opIdx, limit) {\n this.dependencyTracker?.recordSimpleData(\"miterLimit\", opIdx);\n this.ctx.miterLimit = limit;\n }\n\n setDash(opIdx, dashArray, dashPhase) {\n this.dependencyTracker?.recordSimpleData(\"dash\", opIdx);\n const ctx = this.ctx;\n if (ctx.setLineDash !== undefined) {\n ctx.setLineDash(dashArray);\n ctx.lineDashOffset = dashPhase;\n }\n }\n\n setRenderingIntent(opIdx, intent) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setFlatness(opIdx, flatness) {\n // This operation is ignored since we haven't found a use case for it yet.\n }\n\n setGState(opIdx, states) {\n for (const [key, value] of states) {\n switch (key) {\n case \"LW\":\n this.setLineWidth(opIdx, value);\n break;\n case \"LC\":\n this.setLineCap(opIdx, value);\n break;\n case \"LJ\":\n this.setLineJoin(opIdx, value);\n break;\n case \"ML\":\n this.setMiterLimit(opIdx, value);\n break;\n case \"D\":\n this.setDash(opIdx, value[0], value[1]);\n break;\n case \"RI\":\n this.setRenderingIntent(opIdx, value);\n break;\n case \"FL\":\n this.setFlatness(opIdx, value);\n break;\n case \"Font\":\n this.setFont(opIdx, value[0], value[1]);\n break;\n case \"CA\":\n this.dependencyTracker?.recordSimpleData(\"strokeAlpha\", opIdx);\n this.current.strokeAlpha = value;\n break;\n case \"ca\":\n this.dependencyTracker?.recordSimpleData(\"fillAlpha\", opIdx);\n this.ctx.globalAlpha = this.current.fillAlpha = value;\n break;\n case \"BM\":\n this.dependencyTracker?.recordSimpleData(\n \"globalCompositeOperation\",\n opIdx\n );\n this.ctx.globalCompositeOperation = value;\n break;\n case \"SMask\":\n this.dependencyTracker?.recordSimpleData(\"SMask\", opIdx);\n this.current.activeSMask = value ? this.tempSMask : null;\n this.tempSMask = null;\n this.checkSMaskState();\n break;\n case \"TR\":\n this.dependencyTracker?.recordSimpleData(\"filter\", opIdx);\n this.ctx.filter = this.current.transferMaps =\n this.filterFactory.addFilter(value);\n break;\n }\n }\n }\n\n get inSMaskMode() {\n return !!this.suspendedCtx;\n }\n\n checkSMaskState() {\n const inSMaskMode = this.inSMaskMode;\n if (this.current.activeSMask && !inSMaskMode) {\n this.beginSMaskMode();\n } else if (!this.current.activeSMask && inSMaskMode) {\n this.endSMaskMode();\n }\n // Else, the state is okay and nothing needs to be done.\n }\n\n /**\n * Soft mask mode takes the current main drawing canvas and replaces it with\n * a temporary canvas. Any drawing operations that happen on the temporary\n * canvas need to be composed with the main canvas that was suspended (see\n * `compose()`). The temporary canvas also duplicates many of its operations\n * on the suspended canvas to keep them in sync, so that when the soft mask\n * mode ends any clipping paths or transformations will still be active and in\n * the right order on the canvas' graphics state stack.\n */\n beginSMaskMode(opIdx) {\n if (this.inSMaskMode) {\n throw new Error(\"beginSMaskMode called while already in smask mode\");\n }\n const drawnWidth = this.ctx.canvas.width;\n const drawnHeight = this.ctx.canvas.height;\n const cacheId = \"smaskGroupAt\" + this.groupLevel;\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n this.suspendedCtx = this.ctx;\n const ctx = (this.ctx = scratchCanvas.context);\n ctx.setTransform(this.suspendedCtx.getTransform());\n copyCtxState(this.suspendedCtx, ctx);\n mirrorContextOperations(ctx, this.suspendedCtx);\n\n this.setGState(opIdx, [[\"BM\", \"source-over\"]]);\n }\n\n endSMaskMode() {\n if (!this.inSMaskMode) {\n throw new Error(\"endSMaskMode called while not in smask mode\");\n }\n // The soft mask is done, now restore the suspended canvas as the main\n // drawing canvas.\n this.ctx._removeMirroring();\n copyCtxState(this.ctx, this.suspendedCtx);\n this.ctx = this.suspendedCtx;\n\n this.suspendedCtx = null;\n }\n\n compose(dirtyBox) {\n if (!this.current.activeSMask) {\n return;\n }\n\n if (!dirtyBox) {\n dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];\n } else {\n dirtyBox[0] = Math.floor(dirtyBox[0]);\n dirtyBox[1] = Math.floor(dirtyBox[1]);\n dirtyBox[2] = Math.ceil(dirtyBox[2]);\n dirtyBox[3] = Math.ceil(dirtyBox[3]);\n }\n const smask = this.current.activeSMask;\n const suspendedCtx = this.suspendedCtx;\n\n this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);\n // Whatever was drawn has been moved to the suspended canvas, now clear it\n // out of the current canvas.\n this.ctx.save();\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);\n this.ctx.restore();\n }\n\n composeSMask(ctx, smask, layerCtx, layerBox) {\n const layerOffsetX = layerBox[0];\n const layerOffsetY = layerBox[1];\n const layerWidth = layerBox[2] - layerOffsetX;\n const layerHeight = layerBox[3] - layerOffsetY;\n if (layerWidth === 0 || layerHeight === 0) {\n return;\n }\n this.genericComposeSMask(\n smask.context,\n layerCtx,\n layerWidth,\n layerHeight,\n smask.subtype,\n smask.backdrop,\n smask.transferMap,\n layerOffsetX,\n layerOffsetY,\n smask.offsetX,\n smask.offsetY\n );\n ctx.save();\n ctx.globalAlpha = 1;\n ctx.globalCompositeOperation = \"source-over\";\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(layerCtx.canvas, 0, 0);\n ctx.restore();\n }\n\n genericComposeSMask(\n maskCtx,\n layerCtx,\n width,\n height,\n subtype,\n backdrop,\n transferMap,\n layerOffsetX,\n layerOffsetY,\n maskOffsetX,\n maskOffsetY\n ) {\n let maskCanvas = maskCtx.canvas;\n let maskX = layerOffsetX - maskOffsetX;\n let maskY = layerOffsetY - maskOffsetY;\n\n if (backdrop) {\n if (\n maskX < 0 ||\n maskY < 0 ||\n maskX + width > maskCanvas.width ||\n maskY + height > maskCanvas.height\n ) {\n const canvas = this.cachedCanvases.getCanvas(\n \"maskExtension\",\n width,\n height\n );\n const ctx = canvas.context;\n ctx.drawImage(maskCanvas, -maskX, -maskY);\n ctx.globalCompositeOperation = \"destination-atop\";\n ctx.fillStyle = backdrop;\n ctx.fillRect(0, 0, width, height);\n ctx.globalCompositeOperation = \"source-over\";\n\n maskCanvas = canvas.canvas;\n maskX = maskY = 0;\n } else {\n maskCtx.save();\n maskCtx.globalAlpha = 1;\n maskCtx.setTransform(1, 0, 0, 1, 0, 0);\n const clip = new Path2D();\n clip.rect(maskX, maskY, width, height);\n maskCtx.clip(clip);\n maskCtx.globalCompositeOperation = \"destination-atop\";\n maskCtx.fillStyle = backdrop;\n maskCtx.fillRect(maskX, maskY, width, height);\n maskCtx.restore();\n }\n }\n\n layerCtx.save();\n layerCtx.globalAlpha = 1;\n layerCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n if (subtype === \"Alpha\" && transferMap) {\n layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap);\n } else if (subtype === \"Luminosity\") {\n layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap);\n }\n\n const clip = new Path2D();\n clip.rect(layerOffsetX, layerOffsetY, width, height);\n layerCtx.clip(clip);\n layerCtx.globalCompositeOperation = \"destination-in\";\n layerCtx.drawImage(\n maskCanvas,\n maskX,\n maskY,\n width,\n height,\n layerOffsetX,\n layerOffsetY,\n width,\n height\n );\n layerCtx.restore();\n }\n\n save(opIdx) {\n if (this.inSMaskMode) {\n // SMask mode may be turned on/off causing us to lose graphics state.\n // Copy the temporary canvas state to the main(suspended) canvas to keep\n // it in sync.\n copyCtxState(this.ctx, this.suspendedCtx);\n }\n this.ctx.save();\n const old = this.current;\n this.stateStack.push(old);\n this.current = old.clone();\n this.dependencyTracker?.save(opIdx);\n }\n\n restore(opIdx) {\n this.dependencyTracker?.restore(opIdx);\n\n if (this.stateStack.length === 0) {\n if (this.inSMaskMode) {\n this.endSMaskMode();\n }\n return;\n }\n\n this.current = this.stateStack.pop();\n this.ctx.restore();\n if (this.inSMaskMode) {\n // Graphics state is stored on the main(suspended) canvas. Restore its\n // state then copy it over to the temporary canvas.\n copyCtxState(this.suspendedCtx, this.ctx);\n }\n this.checkSMaskState();\n\n // Ensure that the clipping path is reset (fixes issue6413.pdf).\n this.pendingClip = null;\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n\n transform(opIdx, a, b, c, d, e, f) {\n this.dependencyTracker?.recordIncrementalData(\"transform\", opIdx);\n this.ctx.transform(a, b, c, d, e, f);\n\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n }\n\n // Path\n constructPath(opIdx, op, data, minMax) {\n let [path] = data;\n if (!minMax) {\n // The path is empty, so no need to update the current minMax.\n path ||= data[0] = new Path2D();\n this[op](opIdx, path);\n return;\n }\n\n if (this.dependencyTracker !== null) {\n const outerExtraSize = op === OPS.stroke ? this.current.lineWidth / 2 : 0;\n this.dependencyTracker\n .resetBBox(opIdx)\n .recordBBox(\n opIdx,\n this.ctx,\n minMax[0] - outerExtraSize,\n minMax[2] + outerExtraSize,\n minMax[1] - outerExtraSize,\n minMax[3] + outerExtraSize\n )\n .recordDependencies(opIdx, [\"transform\"]);\n }\n\n if (!(path instanceof Path2D)) {\n // Using a SVG string is slightly slower than using the following loop.\n const path2d = (data[0] = new Path2D());\n for (let i = 0, ii = path.length; i < ii; ) {\n switch (path[i++]) {\n case DrawOPS.moveTo:\n path2d.moveTo(path[i++], path[i++]);\n break;\n case DrawOPS.lineTo:\n path2d.lineTo(path[i++], path[i++]);\n break;\n case DrawOPS.curveTo:\n path2d.bezierCurveTo(\n path[i++],\n path[i++],\n path[i++],\n path[i++],\n path[i++],\n path[i++]\n );\n break;\n case DrawOPS.closePath:\n path2d.closePath();\n break;\n default:\n warn(`Unrecognized drawing path operator: ${path[i - 1]}`);\n break;\n }\n }\n path = path2d;\n }\n Util.axialAlignedBoundingBox(\n minMax,\n getCurrentTransform(this.ctx),\n this.current.minMax\n );\n this[op](opIdx, path);\n\n this._pathStartIdx = opIdx;\n }\n\n closePath(opIdx) {\n this.ctx.closePath();\n }\n\n stroke(opIdx, path, consumePath = true) {\n const ctx = this.ctx;\n const strokeColor = this.current.strokeColor;\n // For stroke we want to temporarily change the global alpha to the\n // stroking alpha.\n ctx.globalAlpha = this.current.strokeAlpha;\n if (this.contentVisible) {\n if (typeof strokeColor === \"object\" && strokeColor?.getPattern) {\n const baseTransform = strokeColor.isModifyingCurrentTransform()\n ? ctx.getTransform()\n : null;\n ctx.save();\n ctx.strokeStyle = strokeColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.STROKE,\n opIdx\n );\n if (baseTransform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n );\n path = newPath;\n }\n this.rescaleAndStroke(path, /* saveRestore */ false);\n ctx.restore();\n } else {\n this.rescaleAndStroke(path, /* saveRestore */ true);\n }\n }\n\n this.dependencyTracker?.recordDependencies(opIdx, Dependencies.stroke);\n\n if (consumePath) {\n this.consumePath(\n opIdx,\n path,\n this.current.getClippedPathBoundingBox(\n PathType.STROKE,\n getCurrentTransform(this.ctx)\n )\n );\n }\n\n // Restore the global alpha to the fill alpha\n ctx.globalAlpha = this.current.fillAlpha;\n }\n\n closeStroke(opIdx, path) {\n this.stroke(opIdx, path);\n }\n\n fill(opIdx, path, consumePath = true) {\n const ctx = this.ctx;\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n let needRestore = false;\n\n if (isPatternFill) {\n const baseTransform = fillColor.isModifyingCurrentTransform()\n ? ctx.getTransform()\n : null;\n this.dependencyTracker?.save(opIdx);\n ctx.save();\n ctx.fillStyle = fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL,\n opIdx\n );\n if (baseTransform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n ctx.getTransform().invertSelf().multiplySelf(baseTransform)\n );\n path = newPath;\n }\n needRestore = true;\n }\n\n const intersect = this.current.getClippedPathBoundingBox();\n if (this.contentVisible && intersect !== null) {\n if (this.pendingEOFill) {\n ctx.fill(path, \"evenodd\");\n this.pendingEOFill = false;\n } else {\n ctx.fill(path);\n }\n }\n\n this.dependencyTracker?.recordDependencies(opIdx, Dependencies.fill);\n\n if (needRestore) {\n ctx.restore();\n this.dependencyTracker?.restore(opIdx);\n }\n if (consumePath) {\n this.consumePath(opIdx, path, intersect);\n }\n }\n\n eoFill(opIdx, path) {\n this.pendingEOFill = true;\n this.fill(opIdx, path);\n }\n\n fillStroke(opIdx, path) {\n this.fill(opIdx, path, false);\n this.stroke(opIdx, path, false);\n\n this.consumePath(opIdx, path);\n }\n\n eoFillStroke(opIdx, path) {\n this.pendingEOFill = true;\n this.fillStroke(opIdx, path);\n }\n\n closeFillStroke(opIdx, path) {\n this.fillStroke(opIdx, path);\n }\n\n closeEOFillStroke(opIdx, path) {\n this.pendingEOFill = true;\n this.fillStroke(opIdx, path);\n }\n\n endPath(opIdx, path) {\n this.consumePath(opIdx, path);\n }\n\n rawFillPath(opIdx, path) {\n this.ctx.fill(path);\n this.dependencyTracker\n ?.recordDependencies(opIdx, Dependencies.rawFillPath)\n .recordOperation(opIdx);\n }\n\n // Clipping\n clip(opIdx) {\n this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n this.pendingClip = NORMAL_CLIP;\n }\n\n eoClip(opIdx) {\n this.dependencyTracker?.recordFutureForcedDependency(\"clipMode\", opIdx);\n this.pendingClip = EO_CLIP;\n }\n\n // Text\n beginText(opIdx) {\n this.current.textMatrix = null;\n this.current.textMatrixScale = 1;\n this.current.x = this.current.lineX = 0;\n this.current.y = this.current.lineY = 0;\n\n this.dependencyTracker\n ?.recordOpenMarker(opIdx)\n .resetIncrementalData(\"sameLineText\")\n .resetIncrementalData(\"moveText\", opIdx);\n }\n\n endText(opIdx) {\n const paths = this.pendingTextPaths;\n const ctx = this.ctx;\n\n if (this.dependencyTracker) {\n const { dependencyTracker } = this;\n if (paths !== undefined) {\n dependencyTracker\n .recordFutureForcedDependency(\n \"textClip\",\n dependencyTracker.getOpenMarker()\n )\n .recordFutureForcedDependency(\"textClip\", opIdx);\n }\n dependencyTracker.recordCloseMarker(opIdx);\n }\n\n if (paths !== undefined) {\n const newPath = new Path2D();\n const invTransf = ctx.getTransform().invertSelf();\n for (const { transform, x, y, fontSize, path } of paths) {\n if (!path) {\n continue; // Skip empty paths.\n }\n newPath.addPath(\n path,\n new DOMMatrix(transform)\n .preMultiplySelf(invTransf)\n .translate(x, y)\n .scale(fontSize, -fontSize)\n );\n }\n\n ctx.clip(newPath);\n }\n delete this.pendingTextPaths;\n }\n\n setCharSpacing(opIdx, spacing) {\n this.dependencyTracker?.recordSimpleData(\"charSpacing\", opIdx);\n this.current.charSpacing = spacing;\n }\n\n setWordSpacing(opIdx, spacing) {\n this.dependencyTracker?.recordSimpleData(\"wordSpacing\", opIdx);\n this.current.wordSpacing = spacing;\n }\n\n setHScale(opIdx, scale) {\n this.dependencyTracker?.recordSimpleData(\"hScale\", opIdx);\n this.current.textHScale = scale / 100;\n }\n\n setLeading(opIdx, leading) {\n this.dependencyTracker?.recordSimpleData(\"leading\", opIdx);\n this.current.leading = -leading;\n }\n\n setFont(opIdx, fontRefName, size) {\n this.dependencyTracker\n ?.recordSimpleData(\"font\", opIdx)\n .recordSimpleDataFromNamed(\"fontObj\", fontRefName, opIdx);\n const fontObj = this.commonObjs.get(fontRefName);\n const current = this.current;\n\n if (!fontObj) {\n throw new Error(`Can't find font for ${fontRefName}`);\n }\n current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;\n\n // A valid matrix needs all main diagonal elements to be non-zero\n // This also ensures we bypass FF bugzilla bug #719844.\n if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {\n warn(\"Invalid font matrix for font \" + fontRefName);\n }\n\n // The spec for Tf (setFont) says that 'size' specifies the font 'scale',\n // and in some docs this can be negative (inverted x-y axes).\n if (size < 0) {\n size = -size;\n current.fontDirection = -1;\n } else {\n current.fontDirection = 1;\n }\n\n this.current.font = fontObj;\n this.current.fontSize = size;\n\n if (fontObj.isType3Font) {\n return; // we don't need ctx.font for Type3 fonts\n }\n\n const name = fontObj.loadedName || \"sans-serif\";\n const typeface =\n fontObj.systemFontInfo?.css || `\"${name}\", ${fontObj.fallbackName}`;\n\n let bold = \"normal\";\n if (fontObj.black) {\n bold = \"900\";\n } else if (fontObj.bold) {\n bold = \"bold\";\n }\n const italic = fontObj.italic ? \"italic\" : \"normal\";\n\n // Some font backends cannot handle fonts below certain size.\n // Keeping the font at minimal size and using the fontSizeScale to change\n // the current transformation matrix before the fillText/strokeText.\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227\n let browserFontSize = size;\n if (size < MIN_FONT_SIZE) {\n browserFontSize = MIN_FONT_SIZE;\n } else if (size > MAX_FONT_SIZE) {\n browserFontSize = MAX_FONT_SIZE;\n }\n this.current.fontSizeScale = size / browserFontSize;\n\n this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;\n }\n\n setTextRenderingMode(opIdx, mode) {\n this.dependencyTracker?.recordSimpleData(\"textRenderingMode\", opIdx);\n this.current.textRenderingMode = mode;\n }\n\n setTextRise(opIdx, rise) {\n this.dependencyTracker?.recordSimpleData(\"textRise\", opIdx);\n this.current.textRise = rise;\n }\n\n moveText(opIdx, x, y) {\n this.dependencyTracker\n ?.resetIncrementalData(\"sameLineText\")\n .recordIncrementalData(\"moveText\", opIdx);\n this.current.x = this.current.lineX += x;\n this.current.y = this.current.lineY += y;\n }\n\n setLeadingMoveText(opIdx, x, y) {\n this.setLeading(opIdx, -y);\n this.moveText(opIdx, x, y);\n }\n\n setTextMatrix(opIdx, matrix) {\n this.dependencyTracker?.recordSimpleData(\"textMatrix\", opIdx);\n const { current } = this;\n current.textMatrix = matrix;\n current.textMatrixScale = Math.hypot(matrix[0], matrix[1]);\n\n current.x = current.lineX = 0;\n current.y = current.lineY = 0;\n }\n\n nextLine(opIdx) {\n this.moveText(opIdx, 0, this.current.leading);\n\n this.dependencyTracker?.recordIncrementalData(\n \"moveText\",\n // 'leading' affects 'nextLine' operations. Rather than dealing\n // with transitive dependencies, just mark everything that depends on\n // the 'moveText' operation as depending on the 'leading' value.\n this.dependencyTracker.getSimpleIndex(\"leading\") ?? opIdx\n );\n }\n\n #getScaledPath(path, currentTransform, transform) {\n const newPath = new Path2D();\n newPath.addPath(\n path,\n new DOMMatrix(transform).invertSelf().multiplySelf(currentTransform)\n );\n return newPath;\n }\n\n paintChar(\n opIdx,\n character,\n x,\n y,\n patternFillTransform,\n patternStrokeTransform\n ) {\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const textRenderingMode = current.textRenderingMode;\n const fontSize = current.fontSize / current.fontSizeScale;\n const fillStrokeMode =\n textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n const isAddToPathSet = !!(\n textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG\n );\n const patternFill = current.patternFill && !font.missingFile;\n const patternStroke = current.patternStroke && !font.missingFile;\n\n let path;\n if (\n (font.disableFontFace ||\n isAddToPathSet ||\n patternFill ||\n patternStroke) &&\n !font.missingFile\n ) {\n path = font.getPathGenerator(this.commonObjs, character);\n }\n\n if (path && (font.disableFontFace || patternFill || patternStroke)) {\n ctx.save();\n ctx.translate(x, y);\n ctx.scale(fontSize, -fontSize);\n\n this.dependencyTracker?.recordCharacterBBox(opIdx, ctx, font);\n\n let currentTransform;\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n if (patternFillTransform) {\n currentTransform = ctx.getTransform();\n ctx.setTransform(...patternFillTransform);\n const scaledPath = this.#getScaledPath(\n path,\n currentTransform,\n patternFillTransform\n );\n ctx.fill(scaledPath);\n } else {\n ctx.fill(path);\n }\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n if (patternStrokeTransform) {\n currentTransform ||= ctx.getTransform();\n ctx.setTransform(...patternStrokeTransform);\n const { a, b, c, d } = currentTransform;\n const invPatternTransform = Util.inverseTransform(\n patternStrokeTransform\n );\n const transf = Util.transform(\n [a, b, c, d, 0, 0],\n invPatternTransform\n );\n Util.singularValueDecompose2dScale(transf, XY);\n\n // Cancel the pattern scaling of the line width.\n // If sx and sy are different, unfortunately we can't do anything and\n // we'll have a rendering bug.\n ctx.lineWidth *= Math.max(XY[0], XY[1]) / fontSize;\n ctx.stroke(\n this.#getScaledPath(path, currentTransform, patternStrokeTransform)\n );\n } else {\n ctx.lineWidth /= fontSize;\n ctx.stroke(path);\n }\n }\n ctx.restore();\n } else {\n if (\n fillStrokeMode === TextRenderingMode.FILL ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n ctx.fillText(character, x, y);\n this.dependencyTracker?.recordCharacterBBox(\n opIdx,\n ctx,\n font,\n fontSize,\n x,\n y,\n () => ctx.measureText(character)\n );\n }\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n if (this.dependencyTracker) {\n this.dependencyTracker\n ?.recordCharacterBBox(opIdx, ctx, font, fontSize, x, y, () =>\n ctx.measureText(character)\n )\n .recordDependencies(opIdx, Dependencies.stroke);\n }\n ctx.strokeText(character, x, y);\n }\n }\n\n if (isAddToPathSet) {\n const paths = (this.pendingTextPaths ||= []);\n paths.push({\n transform: getCurrentTransform(ctx),\n x,\n y,\n fontSize,\n path,\n });\n this.dependencyTracker?.recordCharacterBBox(\n opIdx,\n ctx,\n font,\n fontSize,\n x,\n y\n );\n }\n }\n\n get isFontSubpixelAAEnabled() {\n // Checks if anti-aliasing is enabled when scaled text is painted.\n // On Windows GDI scaled fonts looks bad.\n const { context: ctx } = this.cachedCanvases.getCanvas(\n \"isFontSubpixelAAEnabled\",\n 10,\n 10\n );\n ctx.scale(1.5, 1);\n ctx.fillText(\"I\", 0, 10);\n const data = ctx.getImageData(0, 0, 10, 10).data;\n let enabled = false;\n for (let i = 3; i < data.length; i += 4) {\n if (data[i] > 0 && data[i] < 255) {\n enabled = true;\n break;\n }\n }\n return shadow(this, \"isFontSubpixelAAEnabled\", enabled);\n }\n\n showText(opIdx, glyphs) {\n if (this.dependencyTracker) {\n this.dependencyTracker\n .recordDependencies(opIdx, Dependencies.showText)\n .resetBBox(opIdx);\n if (this.current.textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG) {\n this.dependencyTracker\n .recordFutureForcedDependency(\"textClip\", opIdx)\n .inheritPendingDependenciesAsFutureForcedDependencies();\n }\n }\n\n const current = this.current;\n const font = current.font;\n if (font.isType3Font) {\n this.showType3Text(opIdx, glyphs);\n this.dependencyTracker?.recordShowTextOperation(opIdx);\n return undefined;\n }\n\n const fontSize = current.fontSize;\n if (fontSize === 0) {\n this.dependencyTracker?.recordOperation(opIdx);\n return undefined;\n }\n\n const ctx = this.ctx;\n const fontSizeScale = current.fontSizeScale;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const fontDirection = current.fontDirection;\n const textHScale = current.textHScale * fontDirection;\n const glyphsLength = glyphs.length;\n const vertical = font.vertical;\n const spacingDir = vertical ? 1 : -1;\n const defaultVMetrics = font.defaultVMetrics;\n const widthAdvanceScale = fontSize * current.fontMatrix[0];\n\n const simpleFillText =\n current.textRenderingMode === TextRenderingMode.FILL &&\n !font.disableFontFace &&\n !current.patternFill;\n\n ctx.save();\n if (current.textMatrix) {\n ctx.transform(...current.textMatrix);\n }\n ctx.translate(current.x, current.y + current.textRise);\n\n if (fontDirection > 0) {\n ctx.scale(textHScale, -1);\n } else {\n ctx.scale(textHScale, 1);\n }\n\n let patternFillTransform, patternStrokeTransform;\n if (current.patternFill) {\n ctx.save();\n const pattern = current.fillColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL,\n opIdx\n );\n patternFillTransform = getCurrentTransform(ctx);\n ctx.restore();\n ctx.fillStyle = pattern;\n }\n\n if (current.patternStroke) {\n ctx.save();\n const pattern = current.strokeColor.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.STROKE,\n opIdx\n );\n patternStrokeTransform = getCurrentTransform(ctx);\n ctx.restore();\n ctx.strokeStyle = pattern;\n }\n\n let lineWidth = current.lineWidth;\n const scale = current.textMatrixScale;\n if (scale === 0 || lineWidth === 0) {\n const fillStrokeMode =\n current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;\n if (\n fillStrokeMode === TextRenderingMode.STROKE ||\n fillStrokeMode === TextRenderingMode.FILL_STROKE\n ) {\n lineWidth = this.getSinglePixelWidth();\n }\n } else {\n lineWidth /= scale;\n }\n\n if (fontSizeScale !== 1.0) {\n ctx.scale(fontSizeScale, fontSizeScale);\n lineWidth /= fontSizeScale;\n }\n\n ctx.lineWidth = lineWidth;\n\n if (font.isInvalidPDFjsFont) {\n const chars = [];\n let width = 0;\n for (const glyph of glyphs) {\n chars.push(glyph.unicode);\n width += glyph.width;\n }\n const joinedChars = chars.join(\"\");\n ctx.fillText(joinedChars, 0, 0);\n if (this.dependencyTracker !== null) {\n const measure = ctx.measureText(joinedChars);\n this.dependencyTracker\n .recordBBox(\n opIdx,\n this.ctx,\n -measure.actualBoundingBoxLeft,\n measure.actualBoundingBoxRight,\n -measure.actualBoundingBoxAscent,\n measure.actualBoundingBoxDescent\n )\n .recordShowTextOperation(opIdx);\n }\n current.x += width * widthAdvanceScale * textHScale;\n ctx.restore();\n this.compose();\n return undefined;\n }\n\n let x = 0,\n i;\n for (i = 0; i < glyphsLength; ++i) {\n const glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n x += (spacingDir * glyph * fontSize) / 1000;\n continue;\n }\n\n let restoreNeeded = false;\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const character = glyph.fontChar;\n const accent = glyph.accent;\n let scaledX, scaledY;\n let width = glyph.width;\n if (vertical) {\n const vmetric = glyph.vmetric || defaultVMetrics;\n const vx =\n -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;\n const vy = vmetric[2] * widthAdvanceScale;\n\n width = vmetric ? -vmetric[0] : width;\n scaledX = vx / fontSizeScale;\n scaledY = (x + vy) / fontSizeScale;\n } else {\n scaledX = x / fontSizeScale;\n scaledY = 0;\n }\n\n let measure;\n\n if (font.remeasure && width > 0) {\n measure = ctx.measureText(character);\n\n // Some standard fonts may not have the exact width: rescale per\n // character if measured width is greater than expected glyph width\n // and subpixel-aa is enabled, otherwise just center the glyph.\n const measuredWidth =\n ((measure.width * 1000) / fontSize) * fontSizeScale;\n if (width < measuredWidth && this.isFontSubpixelAAEnabled) {\n const characterScaleX = width / measuredWidth;\n restoreNeeded = true;\n ctx.save();\n ctx.scale(characterScaleX, 1);\n scaledX /= characterScaleX;\n } else if (width !== measuredWidth) {\n scaledX +=\n (((width - measuredWidth) / 2000) * fontSize) / fontSizeScale;\n }\n }\n\n // Only attempt to draw the glyph if it is actually in the embedded font\n // file or if there isn't a font file so the fallback font is shown.\n if (this.contentVisible && (glyph.isInFont || font.missingFile)) {\n if (simpleFillText && !accent) {\n // common case\n ctx.fillText(character, scaledX, scaledY);\n\n this.dependencyTracker?.recordCharacterBBox(\n opIdx,\n ctx,\n // If we already measured the character, force usage of that\n measure ? { bbox: null } : font,\n fontSize / fontSizeScale,\n scaledX,\n scaledY,\n () => measure ?? ctx.measureText(character)\n );\n } else {\n this.paintChar(\n opIdx,\n character,\n scaledX,\n scaledY,\n patternFillTransform,\n patternStrokeTransform\n );\n if (accent) {\n const scaledAccentX =\n scaledX + (fontSize * accent.offset.x) / fontSizeScale;\n const scaledAccentY =\n scaledY - (fontSize * accent.offset.y) / fontSizeScale;\n this.paintChar(\n opIdx,\n accent.fontChar,\n scaledAccentX,\n scaledAccentY,\n patternFillTransform,\n patternStrokeTransform\n );\n }\n }\n }\n\n const charWidth = vertical\n ? width * widthAdvanceScale - spacing * fontDirection\n : width * widthAdvanceScale + spacing * fontDirection;\n x += charWidth;\n\n if (restoreNeeded) {\n ctx.restore();\n }\n }\n if (vertical) {\n current.y -= x;\n } else {\n current.x += x * textHScale;\n }\n ctx.restore();\n this.compose();\n\n this.dependencyTracker?.recordShowTextOperation(opIdx);\n return undefined;\n }\n\n showType3Text(opIdx, glyphs) {\n // Type3 fonts - each glyph is a \"mini-PDF\"\n const ctx = this.ctx;\n const current = this.current;\n const font = current.font;\n const fontSize = current.fontSize;\n const fontDirection = current.fontDirection;\n const spacingDir = font.vertical ? 1 : -1;\n const charSpacing = current.charSpacing;\n const wordSpacing = current.wordSpacing;\n const textHScale = current.textHScale * fontDirection;\n const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;\n const glyphsLength = glyphs.length;\n const isTextInvisible =\n current.textRenderingMode === TextRenderingMode.INVISIBLE;\n let i, glyph, width, spacingLength;\n\n if (isTextInvisible || fontSize === 0) {\n return;\n }\n this._cachedScaleForStroking[0] = -1;\n this._cachedGetSinglePixelWidth = null;\n\n ctx.save();\n if (current.textMatrix) {\n ctx.transform(...current.textMatrix);\n }\n ctx.translate(current.x, current.y + current.textRise);\n\n ctx.scale(textHScale, fontDirection);\n\n // Type3 fonts have their own operator list. Avoid mixing it up with the\n // dependency tracker of the main operator list.\n const dependencyTracker = this.dependencyTracker;\n this.dependencyTracker = dependencyTracker\n ? new CanvasNestedDependencyTracker(dependencyTracker, opIdx)\n : null;\n\n for (i = 0; i < glyphsLength; ++i) {\n glyph = glyphs[i];\n if (typeof glyph === \"number\") {\n spacingLength = (spacingDir * glyph * fontSize) / 1000;\n this.ctx.translate(spacingLength, 0);\n current.x += spacingLength * textHScale;\n continue;\n }\n\n const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;\n const operatorList = font.charProcOperatorList[glyph.operatorListId];\n if (!operatorList) {\n warn(`Type3 character \"${glyph.operatorListId}\" is not available.`);\n } else if (this.contentVisible) {\n this.save();\n ctx.scale(fontSize, fontSize);\n ctx.transform(...fontMatrix);\n this.executeOperatorList(operatorList);\n this.restore();\n }\n\n const p = [glyph.width, 0];\n Util.applyTransform(p, fontMatrix);\n width = p[0] * fontSize + spacing;\n\n ctx.translate(width, 0);\n current.x += width * textHScale;\n }\n ctx.restore();\n if (dependencyTracker) {\n this.dependencyTracker = dependencyTracker;\n }\n }\n\n // Type3 fonts\n setCharWidth(opIdx, xWidth, yWidth) {\n // We can safely ignore this since the width should be the same\n // as the width in the Widths array.\n }\n\n setCharWidthAndBounds(opIdx, xWidth, yWidth, llx, lly, urx, ury) {\n const clip = new Path2D();\n clip.rect(llx, lly, urx - llx, ury - lly);\n this.ctx.clip(clip);\n this.dependencyTracker\n ?.recordBBox(opIdx, this.ctx, llx, urx, lly, ury)\n .recordClipBox(opIdx, this.ctx, llx, urx, lly, ury);\n this.endPath(opIdx);\n }\n\n // Color\n getColorN_Pattern(opIdx, IR) {\n let pattern;\n if (IR[0] === \"TilingPattern\") {\n const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);\n const canvasGraphicsFactory = {\n createCanvasGraphics: (ctx, renderingOpIdx) =>\n new CanvasGraphics(\n ctx,\n this.commonObjs,\n this.objs,\n this.canvasFactory,\n this.filterFactory,\n {\n optionalContentConfig: this.optionalContentConfig,\n markedContentStack: this.markedContentStack,\n },\n undefined,\n undefined,\n this.dependencyTracker\n ? new CanvasNestedDependencyTracker(\n this.dependencyTracker,\n renderingOpIdx,\n /* ignoreBBoxes */ true\n )\n : null\n ),\n };\n pattern = new TilingPattern(\n IR,\n this.ctx,\n canvasGraphicsFactory,\n baseTransform\n );\n } else {\n pattern = this._getPattern(opIdx, IR[1], IR[2]);\n }\n return pattern;\n }\n\n setStrokeColorN(opIdx, ...args) {\n this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n this.current.strokeColor = this.getColorN_Pattern(opIdx, args);\n this.current.patternStroke = true;\n }\n\n setFillColorN(opIdx, ...args) {\n this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n this.current.fillColor = this.getColorN_Pattern(opIdx, args);\n this.current.patternFill = true;\n }\n\n setStrokeRGBColor(opIdx, color) {\n this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n this.ctx.strokeStyle = this.current.strokeColor = color;\n this.current.patternStroke = false;\n }\n\n setStrokeTransparent(opIdx) {\n this.dependencyTracker?.recordSimpleData(\"strokeColor\", opIdx);\n this.ctx.strokeStyle = this.current.strokeColor = \"transparent\";\n this.current.patternStroke = false;\n }\n\n setFillRGBColor(opIdx, color) {\n this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n this.ctx.fillStyle = this.current.fillColor = color;\n this.current.patternFill = false;\n }\n\n setFillTransparent(opIdx) {\n this.dependencyTracker?.recordSimpleData(\"fillColor\", opIdx);\n this.ctx.fillStyle = this.current.fillColor = \"transparent\";\n this.current.patternFill = false;\n }\n\n _getPattern(opIdx, objId, matrix = null) {\n let pattern;\n if (this.cachedPatterns.has(objId)) {\n pattern = this.cachedPatterns.get(objId);\n } else {\n pattern = getShadingPattern(this.getObject(opIdx, objId));\n this.cachedPatterns.set(objId, pattern);\n }\n if (matrix) {\n pattern.matrix = matrix;\n }\n return pattern;\n }\n\n shadingFill(opIdx, objId) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n this.save(opIdx);\n const pattern = this._getPattern(opIdx, objId);\n ctx.fillStyle = pattern.getPattern(\n ctx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.SHADING,\n opIdx\n );\n\n const inv = getCurrentTransformInverse(ctx);\n if (inv) {\n const { width, height } = ctx.canvas;\n const minMax = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox([0, 0, width, height], inv, minMax);\n const [x0, y0, x1, y1] = minMax;\n\n this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);\n } else {\n // HACK to draw the gradient onto an infinite rectangle.\n // PDF gradients are drawn across the entire image while\n // Canvas only allows gradients to be drawn in a rectangle\n // The following bug should allow us to remove this.\n // https://bugzilla.mozilla.org/show_bug.cgi?id=664884\n\n this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);\n }\n\n this.dependencyTracker\n ?.resetBBox(opIdx)\n // TODO: Track proper bbox\n .recordFullPageBBox(opIdx)\n .recordDependencies(opIdx, Dependencies.transform)\n .recordDependencies(opIdx, Dependencies.fill)\n .recordOperation(opIdx);\n\n this.compose(this.current.getClippedPathBoundingBox());\n this.restore(opIdx);\n }\n\n // Images\n beginInlineImage() {\n unreachable(\"Should not call beginInlineImage\");\n }\n\n beginImageData() {\n unreachable(\"Should not call beginImageData\");\n }\n\n paintFormXObjectBegin(opIdx, matrix, bbox) {\n if (!this.contentVisible) {\n return;\n }\n this.save(opIdx);\n this.baseTransformStack.push(this.baseTransform);\n\n if (matrix) {\n this.transform(opIdx, ...matrix);\n }\n this.baseTransform = getCurrentTransform(this.ctx);\n\n if (bbox) {\n Util.axialAlignedBoundingBox(\n bbox,\n this.baseTransform,\n this.current.minMax\n );\n const [x0, y0, x1, y1] = bbox;\n const clip = new Path2D();\n clip.rect(x0, y0, x1 - x0, y1 - y0);\n this.ctx.clip(clip);\n this.dependencyTracker?.recordClipBox(opIdx, this.ctx, x0, x1, y0, y1);\n this.endPath(opIdx);\n }\n }\n\n paintFormXObjectEnd(opIdx) {\n if (!this.contentVisible) {\n return;\n }\n this.restore(opIdx);\n this.baseTransform = this.baseTransformStack.pop();\n }\n\n beginGroup(opIdx, group) {\n if (!this.contentVisible) {\n return;\n }\n\n this.save(opIdx);\n // If there's an active soft mask we don't want it enabled for the group, so\n // clear it out. The mask and suspended canvas will be restored in endGroup.\n if (this.inSMaskMode) {\n this.endSMaskMode();\n this.current.activeSMask = null;\n }\n\n const currentCtx = this.ctx;\n // TODO non-isolated groups - according to Rik at adobe non-isolated\n // group results aren't usually that different and they even have tools\n // that ignore this setting. Notes from Rik on implementing:\n // - When you encounter an transparency group, create a new canvas with\n // the dimensions of the bbox\n // - copy the content from the previous canvas to the new canvas\n // - draw as usual\n // - remove the backdrop alpha:\n // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha\n // value of your transparency group and 'alphaBackdrop' the alpha of the\n // backdrop\n // - remove background color:\n // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)\n if (!group.isolated) {\n info(\"TODO: Support non-isolated groups.\");\n }\n\n // TODO knockout - supposedly possible with the clever use of compositing\n // modes.\n if (group.knockout) {\n warn(\"Knockout groups not supported.\");\n }\n\n const currentTransform = getCurrentTransform(currentCtx);\n if (group.matrix) {\n currentCtx.transform(...group.matrix);\n }\n if (!group.bbox) {\n throw new Error(\"Bounding box is required.\");\n }\n\n // Based on the current transform figure out how big the bounding box\n // will actually be.\n let bounds = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox(\n group.bbox,\n getCurrentTransform(currentCtx),\n bounds\n );\n\n // Clip the bounding box to the current canvas.\n const canvasBounds = [\n 0,\n 0,\n currentCtx.canvas.width,\n currentCtx.canvas.height,\n ];\n bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];\n // Use ceil in case we're between sizes so we don't create canvas that is\n // too small and make the canvas at least 1x1 pixels.\n const offsetX = Math.floor(bounds[0]);\n const offsetY = Math.floor(bounds[1]);\n const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);\n const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);\n\n this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);\n\n let cacheId = \"groupAt\" + this.groupLevel;\n if (group.smask) {\n // Using two cache entries is case if masks are used one after another.\n cacheId += \"_smask_\" + (this.smaskCounter++ % 2);\n }\n const scratchCanvas = this.cachedCanvases.getCanvas(\n cacheId,\n drawnWidth,\n drawnHeight\n );\n const groupCtx = scratchCanvas.context;\n\n // Since we created a new canvas that is just the size of the bounding box\n // we have to translate the group ctx.\n groupCtx.translate(-offsetX, -offsetY);\n groupCtx.transform(...currentTransform);\n\n // Apply the bbox to the group context.\n let clip = new Path2D();\n const [x0, y0, x1, y1] = group.bbox;\n clip.rect(x0, y0, x1 - x0, y1 - y0);\n if (group.matrix) {\n const path = new Path2D();\n path.addPath(clip, new DOMMatrix(group.matrix));\n clip = path;\n }\n groupCtx.clip(clip);\n\n if (group.smask) {\n // Saving state and cached mask to be used in setGState.\n this.smaskStack.push({\n canvas: scratchCanvas.canvas,\n context: groupCtx,\n offsetX,\n offsetY,\n subtype: group.smask.subtype,\n backdrop: group.smask.backdrop,\n transferMap: group.smask.transferMap || null,\n startTransformInverse: null, // used during suspend operation\n });\n }\n if (\n !group.smask ||\n // When this is not an SMask group, we only need to update the current\n // transform if recording operations bboxes, so they the bboxes have the\n // correct transform applied.\n this.dependencyTracker\n ) {\n // Setup the current ctx so when the group is popped we draw it at the\n // right location.\n currentCtx.setTransform(1, 0, 0, 1, 0, 0);\n currentCtx.translate(offsetX, offsetY);\n currentCtx.save();\n }\n // The transparency group inherits all off the current graphics state\n // except the blend mode, soft mask, and alpha constants.\n copyCtxState(currentCtx, groupCtx);\n this.ctx = groupCtx;\n this.dependencyTracker\n ?.inheritSimpleDataAsFutureForcedDependencies([\n \"fillAlpha\",\n \"strokeAlpha\",\n \"globalCompositeOperation\",\n ])\n .pushBaseTransform(currentCtx);\n this.setGState(opIdx, [\n [\"BM\", \"source-over\"],\n [\"ca\", 1],\n [\"CA\", 1],\n ]);\n this.groupStack.push(currentCtx);\n this.groupLevel++;\n }\n\n endGroup(opIdx, group) {\n if (!this.contentVisible) {\n return;\n }\n this.groupLevel--;\n const groupCtx = this.ctx;\n const ctx = this.groupStack.pop();\n this.ctx = ctx;\n // Turn off image smoothing to avoid sub pixel interpolation which can\n // look kind of blurry for some pdfs.\n this.ctx.imageSmoothingEnabled = false;\n\n this.dependencyTracker?.popBaseTransform();\n\n if (group.smask) {\n this.tempSMask = this.smaskStack.pop();\n this.restore(opIdx);\n if (this.dependencyTracker) {\n this.ctx.restore();\n }\n } else {\n this.ctx.restore();\n const currentMtx = getCurrentTransform(this.ctx);\n this.restore(opIdx);\n this.ctx.save();\n this.ctx.setTransform(...currentMtx);\n const dirtyBox = MIN_MAX_INIT.slice();\n Util.axialAlignedBoundingBox(\n [0, 0, groupCtx.canvas.width, groupCtx.canvas.height],\n currentMtx,\n dirtyBox\n );\n this.ctx.drawImage(groupCtx.canvas, 0, 0);\n this.ctx.restore();\n this.compose(dirtyBox);\n }\n }\n\n beginAnnotation(opIdx, id, rect, transform, matrix, hasOwnCanvas) {\n // The annotations are drawn just after the page content.\n // The page content drawing can potentially have set a transform,\n // a clipping path, whatever...\n // So in order to have something clean, we restore the initial state.\n this.#restoreInitialState();\n resetCtxToDefault(this.ctx);\n\n this.ctx.save();\n this.save(opIdx);\n\n if (this.baseTransform) {\n this.ctx.setTransform(...this.baseTransform);\n }\n\n if (rect) {\n const width = rect[2] - rect[0];\n const height = rect[3] - rect[1];\n\n if (hasOwnCanvas && this.annotationCanvasMap) {\n transform = transform.slice();\n transform[4] -= rect[0];\n transform[5] -= rect[1];\n\n rect = rect.slice();\n rect[0] = rect[1] = 0;\n rect[2] = width;\n rect[3] = height;\n\n Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx), XY);\n const { viewportScale } = this;\n const canvasWidth = Math.ceil(\n width * this.outputScaleX * viewportScale\n );\n const canvasHeight = Math.ceil(\n height * this.outputScaleY * viewportScale\n );\n\n this.annotationCanvas = this.canvasFactory.create(\n canvasWidth,\n canvasHeight\n );\n const { canvas, context } = this.annotationCanvas;\n this.annotationCanvasMap.set(id, canvas);\n this.annotationCanvas.savedCtx = this.ctx;\n this.ctx = context;\n this.ctx.save();\n this.ctx.setTransform(XY[0], 0, 0, -XY[1], 0, height * XY[1]);\n\n resetCtxToDefault(this.ctx);\n } else {\n resetCtxToDefault(this.ctx);\n\n // Consume a potential path before clipping.\n this.endPath(opIdx);\n\n const clip = new Path2D();\n clip.rect(rect[0], rect[1], width, height);\n this.ctx.clip(clip);\n }\n }\n\n this.current = new CanvasExtraState(\n this.ctx.canvas.width,\n this.ctx.canvas.height\n );\n\n this.transform(opIdx, ...transform);\n this.transform(opIdx, ...matrix);\n }\n\n endAnnotation(opIdx) {\n if (this.annotationCanvas) {\n this.ctx.restore();\n this.#drawFilter();\n\n this.ctx = this.annotationCanvas.savedCtx;\n delete this.annotationCanvas.savedCtx;\n delete this.annotationCanvas;\n }\n }\n\n paintImageMaskXObject(opIdx, img) {\n if (!this.contentVisible) {\n return;\n }\n\n const count = img.count;\n img = this.getObject(opIdx, img.data, img);\n img.count = count;\n\n const ctx = this.ctx;\n const mask = this._createMaskCanvas(opIdx, img);\n const maskCanvas = mask.canvas;\n\n ctx.save();\n // The mask is drawn with the transform applied. Reset the current\n // transform to draw to the identity.\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);\n this.dependencyTracker\n ?.resetBBox(opIdx)\n .recordBBox(\n opIdx,\n this.ctx,\n mask.offsetX,\n mask.offsetX + maskCanvas.width,\n mask.offsetY,\n mask.offsetY + maskCanvas.height\n )\n .recordOperation(opIdx);\n ctx.restore();\n this.compose();\n }\n\n paintImageMaskXObjectRepeat(\n opIdx,\n img,\n scaleX,\n skewX = 0,\n skewY = 0,\n scaleY,\n positions\n ) {\n if (!this.contentVisible) {\n return;\n }\n\n img = this.getObject(opIdx, img.data, img);\n\n const ctx = this.ctx;\n ctx.save();\n const currentTransform = getCurrentTransform(ctx);\n ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);\n const mask = this._createMaskCanvas(opIdx, img);\n\n ctx.setTransform(\n 1,\n 0,\n 0,\n 1,\n mask.offsetX - currentTransform[4],\n mask.offsetY - currentTransform[5]\n );\n this.dependencyTracker?.resetBBox(opIdx);\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n const trans = Util.transform(currentTransform, [\n scaleX,\n skewX,\n skewY,\n scaleY,\n positions[i],\n positions[i + 1],\n ]);\n\n // Here we want to apply the transform at the origin,\n // hence no additional computation is necessary.\n ctx.drawImage(mask.canvas, trans[4], trans[5]);\n this.dependencyTracker?.recordBBox(\n opIdx,\n this.ctx,\n trans[4],\n trans[4] + mask.canvas.width,\n trans[5],\n trans[5] + mask.canvas.height\n );\n }\n ctx.restore();\n this.compose();\n\n this.dependencyTracker?.recordOperation(opIdx);\n }\n\n paintImageMaskXObjectGroup(opIdx, images) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n\n const fillColor = this.current.fillColor;\n const isPatternFill = this.current.patternFill;\n\n this.dependencyTracker\n ?.resetBBox(opIdx)\n .recordDependencies(opIdx, Dependencies.transformAndFill);\n\n for (const image of images) {\n const { data, width, height, transform } = image;\n\n const maskCanvas = this.cachedCanvases.getCanvas(\n \"maskCanvas\",\n width,\n height\n );\n const maskCtx = maskCanvas.context;\n maskCtx.save();\n\n const img = this.getObject(opIdx, data, image);\n putBinaryImageMask(maskCtx, img);\n\n maskCtx.globalCompositeOperation = \"source-in\";\n\n maskCtx.fillStyle = isPatternFill\n ? fillColor.getPattern(\n maskCtx,\n this,\n getCurrentTransformInverse(ctx),\n PathType.FILL,\n opIdx\n )\n : fillColor;\n maskCtx.fillRect(0, 0, width, height);\n\n maskCtx.restore();\n\n ctx.save();\n ctx.transform(...transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n maskCanvas.canvas,\n 0,\n 0,\n width,\n height,\n 0,\n -1,\n 1,\n 1\n );\n\n this.dependencyTracker?.recordBBox(opIdx, ctx, 0, width, 0, height);\n ctx.restore();\n }\n this.compose();\n this.dependencyTracker?.recordOperation(opIdx);\n }\n\n paintImageXObject(opIdx, objId) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(opIdx, objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n this.paintInlineImageXObject(opIdx, imgData);\n }\n\n paintImageXObjectRepeat(opIdx, objId, scaleX, scaleY, positions) {\n if (!this.contentVisible) {\n return;\n }\n const imgData = this.getObject(opIdx, objId);\n if (!imgData) {\n warn(\"Dependent image isn't ready yet\");\n return;\n }\n\n const width = imgData.width;\n const height = imgData.height;\n const map = [];\n for (let i = 0, ii = positions.length; i < ii; i += 2) {\n map.push({\n transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],\n x: 0,\n y: 0,\n w: width,\n h: height,\n });\n }\n this.paintInlineImageXObjectGroup(opIdx, imgData, map);\n }\n\n applyTransferMapsToCanvas(ctx) {\n if (this.current.transferMaps !== \"none\") {\n ctx.filter = this.current.transferMaps;\n ctx.drawImage(ctx.canvas, 0, 0);\n ctx.filter = \"none\";\n }\n return ctx.canvas;\n }\n\n applyTransferMapsToBitmap(imgData) {\n if (this.current.transferMaps === \"none\") {\n return imgData.bitmap;\n }\n const { bitmap, width, height } = imgData;\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n tmpCtx.filter = this.current.transferMaps;\n tmpCtx.drawImage(bitmap, 0, 0);\n tmpCtx.filter = \"none\";\n\n return tmpCanvas.canvas;\n }\n\n paintInlineImageXObject(opIdx, imgData) {\n if (!this.contentVisible) {\n return;\n }\n const width = imgData.width;\n const height = imgData.height;\n const ctx = this.ctx;\n\n this.save(opIdx);\n\n // The filter, if any, will be applied in applyTransferMapsToBitmap.\n // It must be applied to the image before rescaling else some artifacts\n // could appear.\n // The final restore will reset it to its value.\n const { filter } = ctx;\n if (filter !== \"none\" && filter !== \"\") {\n ctx.filter = \"none\";\n }\n\n // scale the image to the unit square\n ctx.scale(1 / width, -1 / height);\n\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = this.applyTransferMapsToBitmap(imgData);\n } else if (\n (typeof HTMLElement === \"function\" && imgData instanceof HTMLElement) ||\n !imgData.data\n ) {\n // typeof check is needed due to node.js support, see issue #8489\n imgToPaint = imgData;\n } else {\n const tmpCanvas = this.cachedCanvases.getCanvas(\n \"inlineImage\",\n width,\n height\n );\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n const scaled = this._scaleImage(\n imgToPaint,\n getCurrentTransformInverse(ctx)\n );\n ctx.imageSmoothingEnabled = getImageSmoothingEnabled(\n getCurrentTransform(ctx),\n imgData.interpolate\n );\n\n this.dependencyTracker\n ?.resetBBox(opIdx)\n .recordBBox(opIdx, ctx, 0, width, -height, 0)\n .recordDependencies(opIdx, Dependencies.imageXObject)\n .recordOperation(opIdx);\n\n drawImageAtIntegerCoords(\n ctx,\n scaled.img,\n 0,\n 0,\n scaled.paintWidth,\n scaled.paintHeight,\n 0,\n -height,\n width,\n height\n );\n this.compose();\n this.restore(opIdx);\n }\n\n paintInlineImageXObjectGroup(opIdx, imgData, map) {\n if (!this.contentVisible) {\n return;\n }\n const ctx = this.ctx;\n let imgToPaint;\n if (imgData.bitmap) {\n imgToPaint = imgData.bitmap;\n } else {\n const w = imgData.width;\n const h = imgData.height;\n\n const tmpCanvas = this.cachedCanvases.getCanvas(\"inlineImage\", w, h);\n const tmpCtx = tmpCanvas.context;\n putBinaryImageData(tmpCtx, imgData);\n imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);\n }\n\n this.dependencyTracker?.resetBBox(opIdx);\n\n for (const entry of map) {\n ctx.save();\n ctx.transform(...entry.transform);\n ctx.scale(1, -1);\n drawImageAtIntegerCoords(\n ctx,\n imgToPaint,\n entry.x,\n entry.y,\n entry.w,\n entry.h,\n 0,\n -1,\n 1,\n 1\n );\n this.dependencyTracker?.recordBBox(opIdx, ctx, 0, 1, -1, 0);\n ctx.restore();\n }\n this.dependencyTracker?.recordOperation(opIdx);\n this.compose();\n }\n\n paintSolidColorImageMask(opIdx) {\n if (!this.contentVisible) {\n return;\n }\n this.dependencyTracker\n ?.resetBBox(opIdx)\n .recordBBox(opIdx, this.ctx, 0, 1, 0, 1)\n .recordDependencies(opIdx, Dependencies.fill)\n .recordOperation(opIdx);\n this.ctx.fillRect(0, 0, 1, 1);\n this.compose();\n }\n\n // Marked content\n\n markPoint(opIdx, tag) {\n // TODO Marked content.\n }\n\n markPointProps(opIdx, tag, properties) {\n // TODO Marked content.\n }\n\n beginMarkedContent(opIdx, tag) {\n this.dependencyTracker?.beginMarkedContent(opIdx);\n this.markedContentStack.push({\n visible: true,\n });\n }\n\n beginMarkedContentProps(opIdx, tag, properties) {\n this.dependencyTracker?.beginMarkedContent(opIdx);\n if (tag === \"OC\") {\n this.markedContentStack.push({\n visible: this.optionalContentConfig.isVisible(properties),\n });\n } else {\n this.markedContentStack.push({\n visible: true,\n });\n }\n this.contentVisible = this.isContentVisible();\n }\n\n endMarkedContent(opIdx) {\n this.dependencyTracker?.endMarkedContent(opIdx);\n this.markedContentStack.pop();\n this.contentVisible = this.isContentVisible();\n }\n\n // Compatibility\n\n beginCompat(opIdx) {\n // TODO ignore undefined operators (should we do that anyway?)\n }\n\n endCompat(opIdx) {\n // TODO stop ignoring undefined operators\n }\n\n // Helper functions\n\n consumePath(opIdx, path, clipBox) {\n const isEmpty = this.current.isEmptyClip();\n if (this.pendingClip) {\n this.current.updateClipFromPath();\n }\n if (!this.pendingClip) {\n this.compose(clipBox);\n }\n const ctx = this.ctx;\n if (this.pendingClip) {\n if (!isEmpty) {\n if (this.pendingClip === EO_CLIP) {\n ctx.clip(path, \"evenodd\");\n } else {\n ctx.clip(path);\n }\n }\n this.pendingClip = null;\n this.dependencyTracker\n ?.bboxToClipBoxDropOperation(opIdx)\n .recordFutureForcedDependency(\"clipPath\", opIdx);\n } else {\n this.dependencyTracker?.recordOperation(opIdx);\n }\n\n this.current.startNewPathAndClipBox(this.current.clipBox);\n }\n\n getSinglePixelWidth() {\n if (!this._cachedGetSinglePixelWidth) {\n const m = getCurrentTransform(this.ctx);\n if (m[1] === 0 && m[2] === 0) {\n // Fast path\n this._cachedGetSinglePixelWidth =\n 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));\n } else {\n const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);\n const normX = Math.hypot(m[0], m[2]);\n const normY = Math.hypot(m[1], m[3]);\n this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;\n }\n }\n return this._cachedGetSinglePixelWidth;\n }\n\n getScaleForStroking() {\n // A pixel has thicknessX = thicknessY = 1;\n // A transformed pixel is a parallelogram and the thicknesses\n // corresponds to the heights.\n // The goal of this function is to rescale before setting the\n // lineWidth in order to have both thicknesses greater or equal\n // to 1 after transform.\n if (this._cachedScaleForStroking[0] === -1) {\n const { lineWidth } = this.current;\n const { a, b, c, d } = this.ctx.getTransform();\n let scaleX, scaleY;\n\n if (b === 0 && c === 0) {\n // Fast path\n const normX = Math.abs(a);\n const normY = Math.abs(d);\n if (normX === normY) {\n if (lineWidth === 0) {\n scaleX = scaleY = 1 / normX;\n } else {\n const scaledLineWidth = normX * lineWidth;\n scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;\n }\n } else if (lineWidth === 0) {\n scaleX = 1 / normX;\n scaleY = 1 / normY;\n } else {\n const scaledXLineWidth = normX * lineWidth;\n const scaledYLineWidth = normY * lineWidth;\n scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;\n scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;\n }\n } else {\n // A pixel (base (x, y)) is transformed by M into a parallelogram:\n // - its area is |det(M)|;\n // - heightY (orthogonal to Mx) has a length: |det(M)| / norm(Mx);\n // - heightX (orthogonal to My) has a length: |det(M)| / norm(My).\n // heightX and heightY are the thicknesses of the transformed pixel\n // and they must be both greater or equal to 1.\n const absDet = Math.abs(a * d - b * c);\n const normX = Math.hypot(a, b);\n const normY = Math.hypot(c, d);\n if (lineWidth === 0) {\n scaleX = normY / absDet;\n scaleY = normX / absDet;\n } else {\n const baseArea = lineWidth * absDet;\n scaleX = normY > baseArea ? normY / baseArea : 1;\n scaleY = normX > baseArea ? normX / baseArea : 1;\n }\n }\n this._cachedScaleForStroking[0] = scaleX;\n this._cachedScaleForStroking[1] = scaleY;\n }\n return this._cachedScaleForStroking;\n }\n\n // Rescale before stroking in order to have a final lineWidth\n // with both thicknesses greater or equal to 1.\n rescaleAndStroke(path, saveRestore) {\n const {\n ctx,\n current: { lineWidth },\n } = this;\n const [scaleX, scaleY] = this.getScaleForStroking();\n\n if (scaleX === scaleY) {\n ctx.lineWidth = (lineWidth || 1) * scaleX;\n ctx.stroke(path);\n return;\n }\n\n const dashes = ctx.getLineDash();\n if (saveRestore) {\n ctx.save();\n }\n\n ctx.scale(scaleX, scaleY);\n SCALE_MATRIX.a = 1 / scaleX;\n SCALE_MATRIX.d = 1 / scaleY;\n const newPath = new Path2D();\n newPath.addPath(path, SCALE_MATRIX);\n\n // How the dashed line is rendered depends on the current transform...\n // so we added a rescale to handle too thin lines and consequently\n // the way the line is dashed will be modified.\n // If scaleX === scaleY, the dashed lines will be rendered correctly\n // else we'll have some bugs (but only with too thin lines).\n // Here we take the max... why not taking the min... or something else.\n // Anyway, as said it's buggy when scaleX !== scaleY.\n if (dashes.length > 0) {\n const scale = Math.max(scaleX, scaleY);\n ctx.setLineDash(dashes.map(x => x / scale));\n ctx.lineDashOffset /= scale;\n }\n\n ctx.lineWidth = lineWidth || 1;\n ctx.stroke(newPath);\n\n if (saveRestore) {\n ctx.restore();\n }\n }\n\n isContentVisible() {\n for (let i = this.markedContentStack.length - 1; i >= 0; i--) {\n if (!this.markedContentStack[i].visible) {\n return false;\n }\n }\n return true;\n }\n}\n\nfor (const op in OPS) {\n if (CanvasGraphics.prototype[op] !== undefined) {\n CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];\n }\n}\n\nexport { CanvasGraphics };\n","/* Copyright 2025 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\nimport { assert } from \"./util.js\";\n\nclass CssFontInfo {\n #buffer;\n\n #view;\n\n #decoder;\n\n static strings = [\"fontFamily\", \"fontWeight\", \"italicAngle\"];\n\n static write(info) {\n const encoder = new TextEncoder();\n const encodedStrings = {};\n let stringsLength = 0;\n for (const prop of CssFontInfo.strings) {\n const encoded = encoder.encode(info[prop]);\n encodedStrings[prop] = encoded;\n stringsLength += 4 + encoded.length;\n }\n\n const buffer = new ArrayBuffer(stringsLength);\n const data = new Uint8Array(buffer);\n const view = new DataView(buffer);\n let offset = 0;\n\n for (const prop of CssFontInfo.strings) {\n const encoded = encodedStrings[prop];\n const length = encoded.length;\n view.setUint32(offset, length);\n data.set(encoded, offset + 4);\n offset += 4 + length;\n }\n assert(offset === buffer.byteLength, \"CssFontInfo.write: Buffer overflow\");\n return buffer;\n }\n\n constructor(buffer) {\n this.#buffer = buffer;\n this.#view = new DataView(this.#buffer);\n this.#decoder = new TextDecoder();\n }\n\n #readString(index) {\n assert(index < CssFontInfo.strings.length, \"Invalid string index\");\n let offset = 0;\n for (let i = 0; i < index; i++) {\n offset += this.#view.getUint32(offset) + 4;\n }\n const length = this.#view.getUint32(offset);\n return this.#decoder.decode(\n new Uint8Array(this.#buffer, offset + 4, length)\n );\n }\n\n get fontFamily() {\n return this.#readString(0);\n }\n\n get fontWeight() {\n return this.#readString(1);\n }\n\n get italicAngle() {\n return this.#readString(2);\n }\n}\n\nclass SystemFontInfo {\n #buffer;\n\n #view;\n\n #decoder;\n\n static strings = [\"css\", \"loadedName\", \"baseFontName\", \"src\"];\n\n static write(info) {\n const encoder = new TextEncoder();\n const encodedStrings = {};\n let stringsLength = 0;\n for (const prop of SystemFontInfo.strings) {\n const encoded = encoder.encode(info[prop]);\n encodedStrings[prop] = encoded;\n stringsLength += 4 + encoded.length;\n }\n stringsLength += 4;\n let encodedStyleStyle,\n encodedStyleWeight,\n lengthEstimate = 1 + stringsLength;\n if (info.style) {\n encodedStyleStyle = encoder.encode(info.style.style);\n encodedStyleWeight = encoder.encode(info.style.weight);\n lengthEstimate +=\n 4 + encodedStyleStyle.length + 4 + encodedStyleWeight.length;\n }\n\n const buffer = new ArrayBuffer(lengthEstimate);\n const data = new Uint8Array(buffer);\n const view = new DataView(buffer);\n let offset = 0;\n\n view.setUint8(offset++, info.guessFallback ? 1 : 0);\n view.setUint32(offset, 0);\n offset += 4;\n stringsLength = 0;\n for (const prop of SystemFontInfo.strings) {\n const encoded = encodedStrings[prop];\n const length = encoded.length;\n stringsLength += 4 + length;\n view.setUint32(offset, length);\n data.set(encoded, offset + 4);\n offset += 4 + length;\n }\n view.setUint32(offset - stringsLength - 4, stringsLength);\n\n if (info.style) {\n view.setUint32(offset, encodedStyleStyle.length);\n data.set(encodedStyleStyle, offset + 4);\n offset += 4 + encodedStyleStyle.length;\n view.setUint32(offset, encodedStyleWeight.length);\n data.set(encodedStyleWeight, offset + 4);\n offset += 4 + encodedStyleWeight.length;\n }\n assert(\n offset <= buffer.byteLength,\n \"SubstitionInfo.write: Buffer overflow\"\n );\n return buffer.transferToFixedLength(offset);\n }\n\n constructor(buffer) {\n this.#buffer = buffer;\n this.#view = new DataView(this.#buffer);\n this.#decoder = new TextDecoder();\n }\n\n get guessFallback() {\n return this.#view.getUint8(0) !== 0;\n }\n\n #readString(index) {\n assert(index < SystemFontInfo.strings.length, \"Invalid string index\");\n let offset = 5;\n for (let i = 0; i < index; i++) {\n offset += this.#view.getUint32(offset) + 4;\n }\n const length = this.#view.getUint32(offset);\n return this.#decoder.decode(\n new Uint8Array(this.#buffer, offset + 4, length)\n );\n }\n\n get css() {\n return this.#readString(0);\n }\n\n get loadedName() {\n return this.#readString(1);\n }\n\n get baseFontName() {\n return this.#readString(2);\n }\n\n get src() {\n return this.#readString(3);\n }\n\n get style() {\n let offset = 1;\n offset += 4 + this.#view.getUint32(offset);\n const styleLength = this.#view.getUint32(offset);\n const style = this.#decoder.decode(\n new Uint8Array(this.#buffer, offset + 4, styleLength)\n );\n offset += 4 + styleLength;\n const weightLength = this.#view.getUint32(offset);\n const weight = this.#decoder.decode(\n new Uint8Array(this.#buffer, offset + 4, weightLength)\n );\n return { style, weight };\n }\n}\n\nclass FontInfo {\n static bools = [\n \"black\",\n \"bold\",\n \"disableFontFace\",\n \"fontExtraProperties\",\n \"isInvalidPDFjsFont\",\n \"isType3Font\",\n \"italic\",\n \"missingFile\",\n \"remeasure\",\n \"vertical\",\n ];\n\n static numbers = [\"ascent\", \"defaultWidth\", \"descent\"];\n\n static strings = [\"fallbackName\", \"loadedName\", \"mimetype\", \"name\"];\n\n static #OFFSET_NUMBERS = Math.ceil((this.bools.length * 2) / 8);\n\n static #OFFSET_BBOX = this.#OFFSET_NUMBERS + this.numbers.length * 8;\n\n static #OFFSET_FONT_MATRIX = this.#OFFSET_BBOX + 1 + 2 * 4;\n\n static #OFFSET_DEFAULT_VMETRICS = this.#OFFSET_FONT_MATRIX + 1 + 8 * 6;\n\n static #OFFSET_STRINGS = this.#OFFSET_DEFAULT_VMETRICS + 1 + 2 * 3;\n\n #buffer;\n\n #decoder;\n\n #view;\n\n constructor({ data, extra }) {\n this.#buffer = data;\n this.#decoder = new TextDecoder();\n this.#view = new DataView(this.#buffer);\n if (extra) {\n Object.assign(this, extra);\n }\n }\n\n #readBoolean(index) {\n assert(index < FontInfo.bools.length, \"Invalid boolean index\");\n const byteOffset = Math.floor(index / 4);\n const bitOffset = (index * 2) % 8;\n const value = (this.#view.getUint8(byteOffset) >> bitOffset) & 0x03;\n return value === 0x00 ? undefined : value === 0x02;\n }\n\n get black() {\n return this.#readBoolean(0);\n }\n\n get bold() {\n return this.#readBoolean(1);\n }\n\n get disableFontFace() {\n return this.#readBoolean(2);\n }\n\n get fontExtraProperties() {\n return this.#readBoolean(3);\n }\n\n get isInvalidPDFjsFont() {\n return this.#readBoolean(4);\n }\n\n get isType3Font() {\n return this.#readBoolean(5);\n }\n\n get italic() {\n return this.#readBoolean(6);\n }\n\n get missingFile() {\n return this.#readBoolean(7);\n }\n\n get remeasure() {\n return this.#readBoolean(8);\n }\n\n get vertical() {\n return this.#readBoolean(9);\n }\n\n #readNumber(index) {\n assert(index < FontInfo.numbers.length, \"Invalid number index\");\n return this.#view.getFloat64(FontInfo.#OFFSET_NUMBERS + index * 8);\n }\n\n get ascent() {\n return this.#readNumber(0);\n }\n\n get defaultWidth() {\n return this.#readNumber(1);\n }\n\n get descent() {\n return this.#readNumber(2);\n }\n\n get bbox() {\n let offset = FontInfo.#OFFSET_BBOX;\n const numCoords = this.#view.getUint8(offset);\n if (numCoords === 0) {\n return undefined;\n }\n offset += 1;\n const bbox = [];\n for (let i = 0; i < 4; i++) {\n bbox.push(this.#view.getInt16(offset, true));\n offset += 2;\n }\n return bbox;\n }\n\n get fontMatrix() {\n let offset = FontInfo.#OFFSET_FONT_MATRIX;\n const numPoints = this.#view.getUint8(offset);\n if (numPoints === 0) {\n return undefined;\n }\n offset += 1;\n const fontMatrix = [];\n for (let i = 0; i < 6; i++) {\n fontMatrix.push(this.#view.getFloat64(offset, true));\n offset += 8;\n }\n return fontMatrix;\n }\n\n get defaultVMetrics() {\n let offset = FontInfo.#OFFSET_DEFAULT_VMETRICS;\n const numMetrics = this.#view.getUint8(offset);\n if (numMetrics === 0) {\n return undefined;\n }\n offset += 1;\n const defaultVMetrics = [];\n for (let i = 0; i < 3; i++) {\n defaultVMetrics.push(this.#view.getInt16(offset, true));\n offset += 2;\n }\n return defaultVMetrics;\n }\n\n #readString(index) {\n assert(index < FontInfo.strings.length, \"Invalid string index\");\n let offset = FontInfo.#OFFSET_STRINGS + 4;\n for (let i = 0; i < index; i++) {\n offset += this.#view.getUint32(offset) + 4;\n }\n const length = this.#view.getUint32(offset);\n const stringData = new Uint8Array(length);\n stringData.set(new Uint8Array(this.#buffer, offset + 4, length));\n return this.#decoder.decode(stringData);\n }\n\n get fallbackName() {\n return this.#readString(0);\n }\n\n get loadedName() {\n return this.#readString(1);\n }\n\n get mimetype() {\n return this.#readString(2);\n }\n\n get name() {\n return this.#readString(3);\n }\n\n get data() {\n let offset = FontInfo.#OFFSET_STRINGS;\n const stringsLength = this.#view.getUint32(offset);\n offset += 4 + stringsLength;\n const systemFontInfoLength = this.#view.getUint32(offset);\n offset += 4 + systemFontInfoLength;\n const cssFontInfoLength = this.#view.getUint32(offset);\n offset += 4 + cssFontInfoLength;\n const length = this.#view.getUint32(offset);\n if (length === 0) {\n return undefined;\n }\n return new Uint8Array(this.#buffer, offset + 4, length);\n }\n\n clearData() {\n let offset = FontInfo.#OFFSET_STRINGS;\n const stringsLength = this.#view.getUint32(offset);\n offset += 4 + stringsLength;\n const systemFontInfoLength = this.#view.getUint32(offset);\n offset += 4 + systemFontInfoLength;\n const cssFontInfoLength = this.#view.getUint32(offset);\n offset += 4 + cssFontInfoLength;\n const length = this.#view.getUint32(offset);\n const data = new Uint8Array(this.#buffer, offset + 4, length);\n data.fill(0);\n this.#view.setUint32(offset, 0);\n // this.#buffer.resize(offset);\n }\n\n get cssFontInfo() {\n let offset = FontInfo.#OFFSET_STRINGS;\n const stringsLength = this.#view.getUint32(offset);\n offset += 4 + stringsLength;\n const systemFontInfoLength = this.#view.getUint32(offset);\n offset += 4 + systemFontInfoLength;\n const cssFontInfoLength = this.#view.getUint32(offset);\n if (cssFontInfoLength === 0) {\n return null;\n }\n const cssFontInfoData = new Uint8Array(cssFontInfoLength);\n cssFontInfoData.set(\n new Uint8Array(this.#buffer, offset + 4, cssFontInfoLength)\n );\n return new CssFontInfo(cssFontInfoData.buffer);\n }\n\n get systemFontInfo() {\n let offset = FontInfo.#OFFSET_STRINGS;\n const stringsLength = this.#view.getUint32(offset);\n offset += 4 + stringsLength;\n const systemFontInfoLength = this.#view.getUint32(offset);\n if (systemFontInfoLength === 0) {\n return null;\n }\n const systemFontInfoData = new Uint8Array(systemFontInfoLength);\n systemFontInfoData.set(\n new Uint8Array(this.#buffer, offset + 4, systemFontInfoLength)\n );\n return new SystemFontInfo(systemFontInfoData.buffer);\n }\n\n static write(font) {\n const systemFontInfoBuffer = font.systemFontInfo\n ? SystemFontInfo.write(font.systemFontInfo)\n : null;\n const cssFontInfoBuffer = font.cssFontInfo\n ? CssFontInfo.write(font.cssFontInfo)\n : null;\n\n const encoder = new TextEncoder();\n const encodedStrings = {};\n let stringsLength = 0;\n for (const prop of FontInfo.strings) {\n encodedStrings[prop] = encoder.encode(font[prop]);\n stringsLength += 4 + encodedStrings[prop].length;\n }\n\n const lengthEstimate =\n FontInfo.#OFFSET_STRINGS +\n 4 +\n stringsLength +\n 4 +\n (systemFontInfoBuffer ? systemFontInfoBuffer.byteLength : 0) +\n 4 +\n (cssFontInfoBuffer ? cssFontInfoBuffer.byteLength : 0) +\n 4 +\n (font.data ? font.data.length : 0);\n\n const buffer = new ArrayBuffer(lengthEstimate);\n const data = new Uint8Array(buffer);\n const view = new DataView(buffer);\n let offset = 0;\n\n const numBools = FontInfo.bools.length;\n let boolByte = 0,\n boolBit = 0;\n for (let i = 0; i < numBools; i++) {\n const value = font[FontInfo.bools[i]];\n // eslint-disable-next-line no-nested-ternary\n const bits = value === undefined ? 0x00 : value ? 0x02 : 0x01;\n boolByte |= bits << boolBit;\n boolBit += 2;\n if (boolBit === 8 || i === numBools - 1) {\n view.setUint8(offset++, boolByte);\n boolByte = 0;\n boolBit = 0;\n }\n }\n assert(\n offset === FontInfo.#OFFSET_NUMBERS,\n \"FontInfo.write: Boolean properties offset mismatch\"\n );\n\n for (const prop of FontInfo.numbers) {\n view.setFloat64(offset, font[prop]);\n offset += 8;\n }\n assert(\n offset === FontInfo.#OFFSET_BBOX,\n \"FontInfo.write: Number properties offset mismatch\"\n );\n\n if (font.bbox) {\n view.setUint8(offset++, 4);\n for (const coord of font.bbox) {\n view.setInt16(offset, coord, true);\n offset += 2;\n }\n } else {\n view.setUint8(offset++, 0);\n offset += 2 * 4; // TODO: optimize this padding away\n }\n\n assert(\n offset === FontInfo.#OFFSET_FONT_MATRIX,\n \"FontInfo.write: BBox properties offset mismatch\"\n );\n\n if (font.fontMatrix) {\n view.setUint8(offset++, 6);\n for (const point of font.fontMatrix) {\n view.setFloat64(offset, point, true);\n offset += 8;\n }\n } else {\n view.setUint8(offset++, 0);\n offset += 8 * 6; // TODO: optimize this padding away\n }\n\n assert(\n offset === FontInfo.#OFFSET_DEFAULT_VMETRICS,\n \"FontInfo.write: FontMatrix properties offset mismatch\"\n );\n\n if (font.defaultVMetrics) {\n view.setUint8(offset++, 1);\n for (const metric of font.defaultVMetrics) {\n view.setInt16(offset, metric, true);\n offset += 2;\n }\n } else {\n view.setUint8(offset++, 0);\n offset += 3 * 2; // TODO: optimize this padding away\n }\n\n assert(\n offset === FontInfo.#OFFSET_STRINGS,\n \"FontInfo.write: DefaultVMetrics properties offset mismatch\"\n );\n\n view.setUint32(FontInfo.#OFFSET_STRINGS, 0);\n offset += 4;\n for (const prop of FontInfo.strings) {\n const encoded = encodedStrings[prop];\n const length = encoded.length;\n view.setUint32(offset, length);\n data.set(encoded, offset + 4);\n offset += 4 + length;\n }\n view.setUint32(\n FontInfo.#OFFSET_STRINGS,\n offset - FontInfo.#OFFSET_STRINGS - 4\n );\n\n if (!systemFontInfoBuffer) {\n view.setUint32(offset, 0);\n offset += 4;\n } else {\n const length = systemFontInfoBuffer.byteLength;\n view.setUint32(offset, length);\n assert(\n offset + 4 + length <= buffer.byteLength,\n \"FontInfo.write: Buffer overflow at systemFontInfo\"\n );\n data.set(new Uint8Array(systemFontInfoBuffer), offset + 4);\n offset += 4 + length;\n }\n\n if (!cssFontInfoBuffer) {\n view.setUint32(offset, 0);\n offset += 4;\n } else {\n const length = cssFontInfoBuffer.byteLength;\n view.setUint32(offset, length);\n assert(\n offset + 4 + length <= buffer.byteLength,\n \"FontInfo.write: Buffer overflow at cssFontInfo\"\n );\n data.set(new Uint8Array(cssFontInfoBuffer), offset + 4);\n offset += 4 + length;\n }\n\n if (font.data === undefined) {\n view.setUint32(offset, 0);\n offset += 4;\n } else {\n view.setUint32(offset, font.data.length);\n data.set(font.data, offset + 4);\n offset += 4 + font.data.length;\n }\n\n assert(offset <= buffer.byteLength, \"FontInfo.write: Buffer overflow\");\n return buffer.transferToFixedLength(offset);\n }\n}\n\nexport { CssFontInfo, FontInfo, SystemFontInfo };\n","/* Copyright 2018 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\nclass GlobalWorkerOptions {\n static #port = null;\n\n static #src = \"\";\n\n /**\n * @type {Worker | null}\n */\n static get workerPort() {\n return this.#port;\n }\n\n /**\n * @param {Worker | null} workerPort - Defines global port for worker process.\n * Overrides the `workerSrc` option.\n */\n static set workerPort(val) {\n if (\n !(typeof Worker !== \"undefined\" && val instanceof Worker) &&\n val !== null\n ) {\n throw new Error(\"Invalid `workerPort` type.\");\n }\n this.#port = val;\n }\n\n /**\n * @type {string}\n */\n static get workerSrc() {\n return this.#src;\n }\n\n /**\n * @param {string} workerSrc - A string containing the path and filename of\n * the worker file.\n *\n * NOTE: The `workerSrc` option should always be set, in order to prevent\n * any issues when using the PDF.js library.\n */\n static set workerSrc(val) {\n if (typeof val !== \"string\") {\n throw new Error(\"Invalid `workerSrc` type.\");\n }\n this.#src = val;\n }\n}\n\nexport { GlobalWorkerOptions };\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\nclass Metadata {\n #map;\n\n #data;\n\n constructor({ parsedData, rawData }) {\n this.#map = parsedData;\n this.#data = rawData;\n }\n\n getRaw() {\n return this.#data;\n }\n\n get(name) {\n return this.#map.get(name) ?? null;\n }\n\n [Symbol.iterator]() {\n return this.#map.entries();\n }\n}\n\nexport { Metadata };\n","/* Copyright 2020 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\nimport {\n info,\n RenderingIntentFlag,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport { MurmurHash3_64 } from \"../shared/murmurhash3.js\";\n\nconst INTERNAL = Symbol(\"INTERNAL\");\n\nclass OptionalContentGroup {\n #isDisplay = false;\n\n #isPrint = false;\n\n #userSet = false;\n\n #visible = true;\n\n constructor(renderingIntent, { name, intent, usage, rbGroups }) {\n this.#isDisplay = !!(renderingIntent & RenderingIntentFlag.DISPLAY);\n this.#isPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\n\n this.name = name;\n this.intent = intent;\n this.usage = usage;\n this.rbGroups = rbGroups;\n }\n\n /**\n * @type {boolean}\n */\n get visible() {\n if (this.#userSet) {\n return this.#visible;\n }\n if (!this.#visible) {\n return false;\n }\n const { print, view } = this.usage;\n\n if (this.#isDisplay) {\n return view?.viewState !== \"OFF\";\n } else if (this.#isPrint) {\n return print?.printState !== \"OFF\";\n }\n return true;\n }\n\n /**\n * @ignore\n */\n _setVisible(internal, visible, userSet = false) {\n if (internal !== INTERNAL) {\n unreachable(\"Internal method `_setVisible` called.\");\n }\n this.#userSet = userSet;\n this.#visible = visible;\n }\n}\n\nclass OptionalContentConfig {\n #cachedGetHash = null;\n\n #groups = new Map();\n\n #initialHash = null;\n\n #order = null;\n\n constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {\n this.renderingIntent = renderingIntent;\n\n this.name = null;\n this.creator = null;\n\n if (data === null) {\n return;\n }\n this.name = data.name;\n this.creator = data.creator;\n this.#order = data.order;\n for (const group of data.groups) {\n this.#groups.set(\n group.id,\n new OptionalContentGroup(renderingIntent, group)\n );\n }\n\n if (data.baseState === \"OFF\") {\n for (const group of this.#groups.values()) {\n group._setVisible(INTERNAL, false);\n }\n }\n\n for (const on of data.on) {\n this.#groups.get(on)._setVisible(INTERNAL, true);\n }\n\n for (const off of data.off) {\n this.#groups.get(off)._setVisible(INTERNAL, false);\n }\n\n // The following code must always run *last* in the constructor.\n this.#initialHash = this.getHash();\n }\n\n #evaluateVisibilityExpression(array) {\n const length = array.length;\n if (length < 2) {\n return true;\n }\n const operator = array[0];\n for (let i = 1; i < length; i++) {\n const element = array[i];\n let state;\n if (Array.isArray(element)) {\n state = this.#evaluateVisibilityExpression(element);\n } else if (this.#groups.has(element)) {\n state = this.#groups.get(element).visible;\n } else {\n warn(`Optional content group not found: ${element}`);\n return true;\n }\n switch (operator) {\n case \"And\":\n if (!state) {\n return false;\n }\n break;\n case \"Or\":\n if (state) {\n return true;\n }\n break;\n case \"Not\":\n return !state;\n default:\n return true;\n }\n }\n return operator === \"And\";\n }\n\n isVisible(group) {\n if (this.#groups.size === 0) {\n return true;\n }\n if (!group) {\n info(\"Optional content group not defined.\");\n return true;\n }\n if (group.type === \"OCG\") {\n if (!this.#groups.has(group.id)) {\n warn(`Optional content group not found: ${group.id}`);\n return true;\n }\n return this.#groups.get(group.id).visible;\n } else if (group.type === \"OCMD\") {\n // Per the spec, the expression should be preferred if available.\n if (group.expression) {\n return this.#evaluateVisibilityExpression(group.expression);\n }\n if (!group.policy || group.policy === \"AnyOn\") {\n // Default\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOn\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n } else if (group.policy === \"AnyOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (!this.#groups.get(id).visible) {\n return true;\n }\n }\n return false;\n } else if (group.policy === \"AllOff\") {\n for (const id of group.ids) {\n if (!this.#groups.has(id)) {\n warn(`Optional content group not found: ${id}`);\n return true;\n }\n if (this.#groups.get(id).visible) {\n return false;\n }\n }\n return true;\n }\n warn(`Unknown optional content policy ${group.policy}.`);\n return true;\n }\n warn(`Unknown group type ${group.type}.`);\n return true;\n }\n\n setVisibility(id, visible = true, preserveRB = true) {\n const group = this.#groups.get(id);\n if (!group) {\n warn(`Optional content group not found: ${id}`);\n return;\n }\n\n // If the visibility is about to be set to `true` and the group belongs to\n // any radiobutton groups, hide all other OCGs in these radiobutton groups,\n // provided that radiobutton state relationships are to be preserved.\n if (preserveRB && visible && group.rbGroups.length) {\n for (const rbGroup of group.rbGroups) {\n for (const otherId of rbGroup) {\n if (otherId !== id) {\n this.#groups.get(otherId)?._setVisible(INTERNAL, false, true);\n }\n }\n }\n }\n\n group._setVisible(INTERNAL, !!visible, /* userSet = */ true);\n\n this.#cachedGetHash = null;\n }\n\n setOCGState({ state, preserveRB }) {\n let operator;\n\n for (const elem of state) {\n switch (elem) {\n case \"ON\":\n case \"OFF\":\n case \"Toggle\":\n operator = elem;\n continue;\n }\n\n const group = this.#groups.get(elem);\n if (!group) {\n continue;\n }\n switch (operator) {\n case \"ON\":\n this.setVisibility(elem, true, preserveRB);\n break;\n case \"OFF\":\n this.setVisibility(elem, false, preserveRB);\n break;\n case \"Toggle\":\n this.setVisibility(elem, !group.visible, preserveRB);\n break;\n }\n }\n\n this.#cachedGetHash = null;\n }\n\n get hasInitialVisibility() {\n return this.#initialHash === null || this.getHash() === this.#initialHash;\n }\n\n getOrder() {\n if (!this.#groups.size) {\n return null;\n }\n if (this.#order) {\n return this.#order.slice();\n }\n return [...this.#groups.keys()];\n }\n\n getGroup(id) {\n return this.#groups.get(id) || null;\n }\n\n getHash() {\n if (this.#cachedGetHash !== null) {\n return this.#cachedGetHash;\n }\n const hash = new MurmurHash3_64();\n\n for (const [id, group] of this.#groups) {\n hash.update(`${id}:${group.visible}`);\n }\n return (this.#cachedGetHash = hash.hexdigest());\n }\n\n [Symbol.iterator]() {\n return this.#groups.entries();\n }\n}\n\nexport { OptionalContentConfig };\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/** @typedef {import(\"../interfaces\").IPDFStream} IPDFStream */\n/** @typedef {import(\"../interfaces\").IPDFStreamReader} IPDFStreamReader */\n// eslint-disable-next-line max-len\n/** @typedef {import(\"../interfaces\").IPDFStreamRangeReader} IPDFStreamRangeReader */\n\nimport { assert } from \"../shared/util.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\n/** @implements {IPDFStream} */\nclass PDFDataTransportStream {\n constructor(\n pdfDataRangeTransport,\n { disableRange = false, disableStream = false }\n ) {\n assert(\n pdfDataRangeTransport,\n 'PDFDataTransportStream - missing required \"pdfDataRangeTransport\" argument.'\n );\n const { length, initialData, progressiveDone, contentDispositionFilename } =\n pdfDataRangeTransport;\n\n this._queuedChunks = [];\n this._progressiveDone = progressiveDone;\n this._contentDispositionFilename = contentDispositionFilename;\n\n if (initialData?.length > 0) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n initialData instanceof Uint8Array &&\n initialData.byteLength === initialData.buffer.byteLength\n ? initialData.buffer\n : new Uint8Array(initialData).buffer;\n this._queuedChunks.push(buffer);\n }\n\n this._pdfDataRangeTransport = pdfDataRangeTransport;\n this._isStreamingSupported = !disableStream;\n this._isRangeSupported = !disableRange;\n this._contentLength = length;\n\n this._fullRequestReader = null;\n this._rangeReaders = [];\n\n pdfDataRangeTransport.addRangeListener((begin, chunk) => {\n this._onReceiveData({ begin, chunk });\n });\n\n pdfDataRangeTransport.addProgressListener((loaded, total) => {\n this._onProgress({ loaded, total });\n });\n\n pdfDataRangeTransport.addProgressiveReadListener(chunk => {\n this._onReceiveData({ chunk });\n });\n\n pdfDataRangeTransport.addProgressiveDoneListener(() => {\n this._onProgressiveDone();\n });\n\n pdfDataRangeTransport.transportReady();\n }\n\n _onReceiveData({ begin, chunk }) {\n // Prevent any possible issues by only transferring a Uint8Array that\n // completely \"utilizes\" its underlying ArrayBuffer.\n const buffer =\n chunk instanceof Uint8Array &&\n chunk.byteLength === chunk.buffer.byteLength\n ? chunk.buffer\n : new Uint8Array(chunk).buffer;\n\n if (begin === undefined) {\n if (this._fullRequestReader) {\n this._fullRequestReader._enqueue(buffer);\n } else {\n this._queuedChunks.push(buffer);\n }\n } else {\n const found = this._rangeReaders.some(function (rangeReader) {\n if (rangeReader._begin !== begin) {\n return false;\n }\n rangeReader._enqueue(buffer);\n return true;\n });\n assert(\n found,\n \"_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.\"\n );\n }\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n _onProgress(evt) {\n if (evt.total === undefined) {\n // Reporting to first range reader, if it exists.\n this._rangeReaders[0]?.onProgress?.({ loaded: evt.loaded });\n } else {\n this._fullRequestReader?.onProgress?.({\n loaded: evt.loaded,\n total: evt.total,\n });\n }\n }\n\n _onProgressiveDone() {\n this._fullRequestReader?.progressiveDone();\n this._progressiveDone = true;\n }\n\n _removeRangeReader(reader) {\n const i = this._rangeReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFDataTransportStream.getFullReader can only be called once.\"\n );\n const queuedChunks = this._queuedChunks;\n this._queuedChunks = null;\n return new PDFDataTransportStreamReader(\n this,\n queuedChunks,\n this._progressiveDone,\n this._contentDispositionFilename\n );\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFDataTransportStreamRangeReader(this, begin, end);\n this._pdfDataRangeTransport.requestDataRange(begin, end);\n this._rangeReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeReaders.slice(0)) {\n reader.cancel(reason);\n }\n this._pdfDataRangeTransport.abort();\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFDataTransportStreamReader {\n constructor(\n stream,\n queuedChunks,\n progressiveDone = false,\n contentDispositionFilename = null\n ) {\n this._stream = stream;\n this._done = progressiveDone || false;\n this._filename = isPdfFile(contentDispositionFilename)\n ? contentDispositionFilename\n : null;\n this._queuedChunks = queuedChunks || [];\n this._loaded = 0;\n for (const chunk of this._queuedChunks) {\n this._loaded += chunk.byteLength;\n }\n this._requests = [];\n this._headersReady = Promise.resolve();\n stream._fullRequestReader = this;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // Ignore new data.\n }\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunks.push(chunk);\n }\n this._loaded += chunk.byteLength;\n }\n\n get headersReady() {\n return this._headersReady;\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._stream._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._stream._isStreamingSupported;\n }\n\n get contentLength() {\n return this._stream._contentLength;\n }\n\n async read() {\n if (this._queuedChunks.length > 0) {\n const chunk = this._queuedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n progressiveDone() {\n if (this._done) {\n return;\n }\n this._done = true;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFDataTransportStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._begin = begin;\n this._end = end;\n this._queuedChunk = null;\n this._requests = [];\n this._done = false;\n\n this.onProgress = null;\n }\n\n _enqueue(chunk) {\n if (this._done) {\n return; // ignore new data\n }\n if (this._requests.length === 0) {\n this._queuedChunk = chunk;\n } else {\n const requestsCapability = this._requests.shift();\n requestsCapability.resolve({ value: chunk, done: false });\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n this._done = true;\n this._stream._removeRangeReader(this);\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._queuedChunk) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._stream._removeRangeReader(this);\n }\n}\n\nexport { PDFDataTransportStream };\n","/* Copyright 2017 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\nimport { stringToBytes } from \"../shared/util.js\";\n\n// This getFilenameFromContentDispositionHeader function is adapted from\n// https://github.com/Rob--W/open-in-browser/blob/7e2e35a38b8b4e981b11da7b2f01df0149049e92/extension/content-disposition.js\n// with the following changes:\n// - Modified to conform to PDF.js's coding style.\n// - Move return to the end of the function to prevent Babel from dropping the\n// function declarations.\n\n/**\n * Extract file name from the Content-Disposition HTTP response header.\n *\n * @param {string} contentDisposition\n * @returns {string} Filename, if found in the Content-Disposition header.\n */\nfunction getFilenameFromContentDispositionHeader(contentDisposition) {\n let needsEncodingFixup = true;\n\n // filename*=ext-value (\"ext-value\" from RFC 5987, referenced by RFC 6266).\n let tmp = toParamRegExp(\"filename\\\\*\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = unescape(filename);\n filename = rfc5987decode(filename);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // Continuations (RFC 2231 section 3, referenced by RFC 5987 section 3.1).\n // filename*n*=part\n // filename*n=part\n tmp = rfc2231getparam(contentDisposition);\n if (tmp) {\n // RFC 2047, section\n const filename = rfc2047decode(tmp);\n return fixupEncoding(filename);\n }\n\n // filename=value (RFC 5987, section 4.1).\n tmp = toParamRegExp(\"filename\", \"i\").exec(contentDisposition);\n if (tmp) {\n tmp = tmp[1];\n let filename = rfc2616unquote(tmp);\n filename = rfc2047decode(filename);\n return fixupEncoding(filename);\n }\n\n // After this line there are only function declarations. We cannot put\n // \"return\" here for readability because babel would then drop the function\n // declarations...\n function toParamRegExp(attributePattern, flags) {\n return new RegExp(\n \"(?:^|;)\\\\s*\" +\n attributePattern +\n \"\\\\s*=\\\\s*\" +\n // Captures: value = token | quoted-string\n // (RFC 2616, section 3.6 and referenced by RFC 6266 4.1)\n \"(\" +\n '[^\";\\\\s][^;\\\\s]*' +\n \"|\" +\n '\"(?:[^\"\\\\\\\\]|\\\\\\\\\"?)+\"?' +\n \")\",\n flags\n );\n }\n function textdecode(encoding, value) {\n if (encoding) {\n if (!/^[\\x00-\\xFF]+$/.test(value)) {\n return value;\n }\n try {\n const decoder = new TextDecoder(encoding, { fatal: true });\n const buffer = stringToBytes(value);\n value = decoder.decode(buffer);\n needsEncodingFixup = false;\n } catch {\n // TextDecoder constructor threw - unrecognized encoding.\n }\n }\n return value;\n }\n function fixupEncoding(value) {\n if (needsEncodingFixup && /[\\x80-\\xff]/.test(value)) {\n // Maybe multi-byte UTF-8.\n value = textdecode(\"utf-8\", value);\n if (needsEncodingFixup) {\n // Try iso-8859-1 encoding.\n value = textdecode(\"iso-8859-1\", value);\n }\n }\n return value;\n }\n function rfc2231getparam(contentDispositionStr) {\n const matches = [];\n let match;\n // Iterate over all filename*n= and filename*n*= with n being an integer\n // of at least zero. Any non-zero number must not start with '0'.\n const iter = toParamRegExp(\"filename\\\\*((?!0\\\\d)\\\\d+)(\\\\*?)\", \"ig\");\n while ((match = iter.exec(contentDispositionStr)) !== null) {\n let [, n, quot, part] = match; // eslint-disable-line prefer-const\n n = parseInt(n, 10);\n if (n in matches) {\n // Ignore anything after the invalid second filename*0.\n if (n === 0) {\n break;\n }\n continue;\n }\n matches[n] = [quot, part];\n }\n const parts = [];\n for (let n = 0; n < matches.length; ++n) {\n if (!(n in matches)) {\n // Numbers must be consecutive. Truncate when there is a hole.\n break;\n }\n let [quot, part] = matches[n]; // eslint-disable-line prefer-const\n part = rfc2616unquote(part);\n if (quot) {\n part = unescape(part);\n if (n === 0) {\n part = rfc5987decode(part);\n }\n }\n parts.push(part);\n }\n return parts.join(\"\");\n }\n function rfc2616unquote(value) {\n if (value.startsWith('\"')) {\n const parts = value.slice(1).split('\\\\\"');\n // Find the first unescaped \" and terminate there.\n for (let i = 0; i < parts.length; ++i) {\n const quotindex = parts[i].indexOf('\"');\n if (quotindex !== -1) {\n parts[i] = parts[i].slice(0, quotindex);\n parts.length = i + 1; // Truncates and stop the iteration.\n }\n parts[i] = parts[i].replaceAll(/\\\\(.)/g, \"$1\");\n }\n value = parts.join('\"');\n }\n return value;\n }\n function rfc5987decode(extvalue) {\n // Decodes \"ext-value\" from RFC 5987.\n const encodingend = extvalue.indexOf(\"'\");\n if (encodingend === -1) {\n // Some servers send \"filename*=\" without encoding 'language' prefix,\n // e.g. in https://github.com/Rob--W/open-in-browser/issues/26\n // Let's accept the value like Firefox (57) (Chrome 62 rejects it).\n return extvalue;\n }\n const encoding = extvalue.slice(0, encodingend);\n const langvalue = extvalue.slice(encodingend + 1);\n // Ignore language (RFC 5987 section 3.2.1, and RFC 6266 section 4.1 ).\n const value = langvalue.replace(/^[^']*'/, \"\");\n return textdecode(encoding, value);\n }\n function rfc2047decode(value) {\n // RFC 2047-decode the result. Firefox tried to drop support for it, but\n // backed out because some servers use it - https://bugzil.la/875615\n // Firefox's condition for decoding is here: https://searchfox.org/mozilla-central/rev/4a590a5a15e35d88a3b23dd6ac3c471cf85b04a8/netwerk/mime/nsMIMEHeaderParamImpl.cpp#742-748\n\n // We are more strict and only recognize RFC 2047-encoding if the value\n // starts with \"=?\", since then it is likely that the full value is\n // RFC 2047-encoded.\n\n // Firefox also decodes words even where RFC 2047 section 5 states:\n // \"An 'encoded-word' MUST NOT appear within a 'quoted-string'.\"\n if (!value.startsWith(\"=?\") || /[\\x00-\\x19\\x80-\\xff]/.test(value)) {\n return value;\n }\n // RFC 2047, section 2.4\n // encoded-word = \"=?\" charset \"?\" encoding \"?\" encoded-text \"?=\"\n // charset = token (but let's restrict to characters that denote a\n // possibly valid encoding).\n // encoding = q or b\n // encoded-text = any printable ASCII character other than ? or space.\n // ... but Firefox permits ? and space.\n return value.replaceAll(\n /=\\?([\\w-]*)\\?([QqBb])\\?((?:[^?]|\\?(?!=))*)\\?=/g,\n function (matches, charset, encoding, text) {\n if (encoding === \"q\" || encoding === \"Q\") {\n // RFC 2047 section 4.2.\n text = text.replaceAll(\"_\", \" \");\n text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function (match, hex) {\n return String.fromCharCode(parseInt(hex, 16));\n });\n return textdecode(charset, text);\n } // else encoding is b or B - base64 (RFC 2047 section 4.1)\n try {\n text = atob(text);\n } catch {}\n return textdecode(charset, text);\n }\n );\n }\n\n return \"\";\n}\n\nexport { getFilenameFromContentDispositionHeader };\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\nimport { assert, ResponseException } from \"../shared/util.js\";\nimport { getFilenameFromContentDispositionHeader } from \"./content_disposition.js\";\nimport { isPdfFile } from \"./display_utils.js\";\n\nfunction createHeaders(isHttp, httpHeaders) {\n const headers = new Headers();\n\n if (!isHttp || !httpHeaders || typeof httpHeaders !== \"object\") {\n return headers;\n }\n for (const key in httpHeaders) {\n const val = httpHeaders[key];\n if (val !== undefined) {\n headers.append(key, val);\n }\n }\n return headers;\n}\n\nfunction getResponseOrigin(url) {\n // Notably, null is distinct from \"null\" string (e.g. from file:-URLs).\n return URL.parse(url)?.origin ?? null;\n}\n\nfunction validateRangeRequestCapabilities({\n responseHeaders,\n isHttp,\n rangeChunkSize,\n disableRange,\n}) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(rangeChunkSize) && rangeChunkSize > 0,\n \"rangeChunkSize must be an integer larger than zero.\"\n );\n }\n const returnValues = {\n allowRangeRequests: false,\n suggestedLength: undefined,\n };\n\n const length = parseInt(responseHeaders.get(\"Content-Length\"), 10);\n if (!Number.isInteger(length)) {\n return returnValues;\n }\n\n returnValues.suggestedLength = length;\n\n if (length <= 2 * rangeChunkSize) {\n // The file size is smaller than the size of two chunks, so it does not\n // make any sense to abort the request and retry with a range request.\n return returnValues;\n }\n\n if (disableRange || !isHttp) {\n return returnValues;\n }\n if (responseHeaders.get(\"Accept-Ranges\") !== \"bytes\") {\n return returnValues;\n }\n\n const contentEncoding = responseHeaders.get(\"Content-Encoding\") || \"identity\";\n if (contentEncoding !== \"identity\") {\n return returnValues;\n }\n\n returnValues.allowRangeRequests = true;\n return returnValues;\n}\n\nfunction extractFilenameFromHeader(responseHeaders) {\n const contentDisposition = responseHeaders.get(\"Content-Disposition\");\n if (contentDisposition) {\n let filename = getFilenameFromContentDispositionHeader(contentDisposition);\n if (filename.includes(\"%\")) {\n try {\n filename = decodeURIComponent(filename);\n } catch {}\n }\n if (isPdfFile(filename)) {\n return filename;\n }\n }\n return null;\n}\n\nfunction createResponseError(status, url) {\n return new ResponseException(\n `Unexpected server response (${status}) while retrieving PDF \"${url}\".`,\n status,\n /* missing = */ status === 404 || (status === 0 && url.startsWith(\"file:\"))\n );\n}\n\nfunction validateResponseStatus(status) {\n return status === 200 || status === 206;\n}\n\nexport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n validateResponseStatus,\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\nimport { AbortException, assert, warn } from \"../shared/util.js\";\nimport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n validateResponseStatus,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./fetch_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nfunction createFetchOptions(headers, withCredentials, abortController) {\n return {\n method: \"GET\",\n headers,\n signal: abortController.signal,\n mode: \"cors\",\n credentials: withCredentials ? \"include\" : \"same-origin\",\n redirect: \"follow\",\n };\n}\n\nfunction getArrayBuffer(val) {\n if (val instanceof Uint8Array) {\n return val.buffer;\n }\n if (val instanceof ArrayBuffer) {\n return val;\n }\n warn(`getArrayBuffer - unexpected data format: ${val}`);\n return new Uint8Array(val).buffer;\n}\n\n/** @implements {IPDFStream} */\nclass PDFFetchStream {\n _responseOrigin = null;\n\n constructor(source) {\n this.source = source;\n this.isHttp = /^https?:/i.test(source.url);\n this.headers = createHeaders(this.isHttp, source.httpHeaders);\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFFetchStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFFetchStreamReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const reader = new PDFFetchStreamRangeReader(this, begin, end);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFFetchStreamReader {\n constructor(stream) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n this._filename = null;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._contentLength = source.length;\n this._headersCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._abortController = new AbortController();\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n // Always create a copy of the headers.\n const headers = new Headers(stream.headers);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(headers, this._withCredentials, this._abortController)\n )\n .then(response => {\n stream._responseOrigin = getResponseOrigin(response.url);\n\n if (!validateResponseStatus(response.status)) {\n throw createResponseError(response.status, url);\n }\n this._reader = response.body.getReader();\n this._headersCapability.resolve();\n\n const responseHeaders = response.headers;\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n responseHeaders,\n isHttp: stream.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n this._isRangeSupported = allowRangeRequests;\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(responseHeaders);\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this.cancel(new AbortException(\"Streaming is disabled.\"));\n }\n })\n .catch(this._headersCapability.reject);\n\n this.onProgress = null;\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._headersCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFFetchStreamRangeReader {\n constructor(stream, begin, end) {\n this._stream = stream;\n this._reader = null;\n this._loaded = 0;\n const source = stream.source;\n this._withCredentials = source.withCredentials || false;\n this._readCapability = Promise.withResolvers();\n this._isStreamingSupported = !source.disableStream;\n\n this._abortController = new AbortController();\n // Always create a copy of the headers.\n const headers = new Headers(stream.headers);\n headers.append(\"Range\", `bytes=${begin}-${end - 1}`);\n\n const url = source.url;\n fetch(\n url,\n createFetchOptions(headers, this._withCredentials, this._abortController)\n )\n .then(response => {\n const responseOrigin = getResponseOrigin(response.url);\n\n if (responseOrigin !== stream._responseOrigin) {\n throw new Error(\n `Expected range response-origin \"${responseOrigin}\" to match \"${stream._responseOrigin}\".`\n );\n }\n if (!validateResponseStatus(response.status)) {\n throw createResponseError(response.status, url);\n }\n this._readCapability.resolve();\n this._reader = response.body.getReader();\n })\n .catch(this._readCapability.reject);\n\n this.onProgress = null;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n const { value, done } = await this._reader.read();\n if (done) {\n return { value, done };\n }\n this._loaded += value.byteLength;\n this.onProgress?.({ loaded: this._loaded });\n\n return { value: getArrayBuffer(value), done: false };\n }\n\n cancel(reason) {\n this._reader?.cancel(reason);\n this._abortController.abort();\n }\n}\n\nexport { PDFFetchStream };\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\nimport { assert, stringToBytes, warn } from \"../shared/util.js\";\nimport {\n createHeaders,\n createResponseError,\n extractFilenameFromHeader,\n getResponseOrigin,\n validateRangeRequestCapabilities,\n} from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./network.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst OK_RESPONSE = 200;\nconst PARTIAL_CONTENT_RESPONSE = 206;\n\nfunction getArrayBuffer(xhr) {\n const data = xhr.response;\n if (typeof data !== \"string\") {\n return data;\n }\n return stringToBytes(data).buffer;\n}\n\nclass NetworkManager {\n _responseOrigin = null;\n\n constructor({ url, httpHeaders, withCredentials }) {\n this.url = url;\n this.isHttp = /^https?:/i.test(url);\n this.headers = createHeaders(this.isHttp, httpHeaders);\n this.withCredentials = withCredentials || false;\n\n this.currXhrId = 0;\n this.pendingRequests = Object.create(null);\n }\n\n request(args) {\n const xhr = new XMLHttpRequest();\n const xhrId = this.currXhrId++;\n const pendingRequest = (this.pendingRequests[xhrId] = { xhr });\n\n xhr.open(\"GET\", this.url);\n xhr.withCredentials = this.withCredentials;\n for (const [key, val] of this.headers) {\n xhr.setRequestHeader(key, val);\n }\n if (this.isHttp && \"begin\" in args && \"end\" in args) {\n xhr.setRequestHeader(\"Range\", `bytes=${args.begin}-${args.end - 1}`);\n pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;\n } else {\n pendingRequest.expectedStatus = OK_RESPONSE;\n }\n xhr.responseType = \"arraybuffer\";\n\n assert(args.onError, \"Expected `onError` callback to be provided.\");\n xhr.onerror = () => {\n args.onError(xhr.status);\n };\n xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);\n xhr.onprogress = this.onProgress.bind(this, xhrId);\n\n pendingRequest.onHeadersReceived = args.onHeadersReceived;\n pendingRequest.onDone = args.onDone;\n pendingRequest.onError = args.onError;\n pendingRequest.onProgress = args.onProgress;\n\n xhr.send(null);\n\n return xhrId;\n }\n\n onProgress(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n pendingRequest.onProgress?.(evt);\n }\n\n onStateChange(xhrId, evt) {\n const pendingRequest = this.pendingRequests[xhrId];\n if (!pendingRequest) {\n return; // Maybe abortRequest was called...\n }\n\n const xhr = pendingRequest.xhr;\n if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {\n pendingRequest.onHeadersReceived();\n delete pendingRequest.onHeadersReceived;\n }\n\n if (xhr.readyState !== 4) {\n return;\n }\n\n if (!(xhrId in this.pendingRequests)) {\n // The XHR request might have been aborted in onHeadersReceived()\n // callback, in which case we should abort request.\n return;\n }\n\n delete this.pendingRequests[xhrId];\n\n // Success status == 0 can be on ftp, file and other protocols.\n if (xhr.status === 0 && this.isHttp) {\n pendingRequest.onError(xhr.status);\n return;\n }\n const xhrStatus = xhr.status || OK_RESPONSE;\n\n // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:\n // \"A server MAY ignore the Range header\". This means it's possible to\n // get a 200 rather than a 206 response from a range request.\n const ok_response_on_range_request =\n xhrStatus === OK_RESPONSE &&\n pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;\n\n if (\n !ok_response_on_range_request &&\n xhrStatus !== pendingRequest.expectedStatus\n ) {\n pendingRequest.onError(xhr.status);\n return;\n }\n\n const chunk = getArrayBuffer(xhr);\n if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {\n const rangeHeader = xhr.getResponseHeader(\"Content-Range\");\n const matches = /bytes (\\d+)-(\\d+)\\/(\\d+)/.exec(rangeHeader);\n if (matches) {\n pendingRequest.onDone({\n begin: parseInt(matches[1], 10),\n chunk,\n });\n } else {\n warn(`Missing or invalid \"Content-Range\" header.`);\n pendingRequest.onError(0);\n }\n } else if (chunk) {\n pendingRequest.onDone({\n begin: 0,\n chunk,\n });\n } else {\n pendingRequest.onError(xhr.status);\n }\n }\n\n getRequestXhr(xhrId) {\n return this.pendingRequests[xhrId].xhr;\n }\n\n isPendingRequest(xhrId) {\n return xhrId in this.pendingRequests;\n }\n\n abortRequest(xhrId) {\n const xhr = this.pendingRequests[xhrId].xhr;\n delete this.pendingRequests[xhrId];\n xhr.abort();\n }\n}\n\n/** @implements {IPDFStream} */\nclass PDFNetworkStream {\n constructor(source) {\n this._source = source;\n this._manager = new NetworkManager(source);\n this._rangeChunkSize = source.rangeChunkSize;\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n _onRangeRequestReaderClosed(reader) {\n const i = this._rangeRequestReaders.indexOf(reader);\n if (i >= 0) {\n this._rangeRequestReaders.splice(i, 1);\n }\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNetworkStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFNetworkStreamFullRequestReader(\n this._manager,\n this._source\n );\n return this._fullRequestReader;\n }\n\n getRangeReader(begin, end) {\n const reader = new PDFNetworkStreamRangeRequestReader(\n this._manager,\n begin,\n end\n );\n reader.onClosed = this._onRangeRequestReaderClosed.bind(this);\n this._rangeRequestReaders.push(reader);\n return reader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\n/** @implements {IPDFStreamReader} */\nclass PDFNetworkStreamFullRequestReader {\n constructor(manager, source) {\n this._manager = manager;\n\n this._url = source.url;\n this._fullRequestId = manager.request({\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n });\n this._headersCapability = Promise.withResolvers();\n this._disableRange = source.disableRange || false;\n this._contentLength = source.length; // Optional\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = false;\n this._isRangeSupported = false;\n\n this._cachedChunks = [];\n this._requests = [];\n this._done = false;\n this._storedError = undefined;\n this._filename = null;\n\n this.onProgress = null;\n }\n\n _onHeadersReceived() {\n const fullRequestXhrId = this._fullRequestId;\n const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);\n\n this._manager._responseOrigin = getResponseOrigin(\n fullRequestXhr.responseURL\n );\n\n const rawResponseHeaders = fullRequestXhr.getAllResponseHeaders();\n const responseHeaders = new Headers(\n rawResponseHeaders\n ? rawResponseHeaders\n .trimStart()\n .replace(/[^\\S ]+$/, \"\") // Not `trimEnd`, to keep regular spaces.\n .split(/[\\r\\n]+/)\n .map(x => {\n const [key, ...val] = x.split(\": \");\n return [key, val.join(\": \")];\n })\n : []\n );\n\n const { allowRangeRequests, suggestedLength } =\n validateRangeRequestCapabilities({\n responseHeaders,\n isHttp: this._manager.isHttp,\n rangeChunkSize: this._rangeChunkSize,\n disableRange: this._disableRange,\n });\n\n if (allowRangeRequests) {\n this._isRangeSupported = true;\n }\n // Setting right content length.\n this._contentLength = suggestedLength || this._contentLength;\n\n this._filename = extractFilenameFromHeader(responseHeaders);\n\n if (this._isRangeSupported) {\n // NOTE: by cancelling the full request, and then issuing range\n // requests, there will be an issue for sites where you can only\n // request the pdf once. However, if this is the case, then the\n // server should not be returning that it can support range requests.\n this._manager.abortRequest(fullRequestXhrId);\n }\n\n this._headersCapability.resolve();\n }\n\n _onDone(data) {\n if (data) {\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: data.chunk, done: false });\n } else {\n this._cachedChunks.push(data.chunk);\n }\n }\n this._done = true;\n if (this._cachedChunks.length > 0) {\n return;\n }\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n }\n\n _onError(status) {\n this._storedError = createResponseError(status, this._url);\n this._headersCapability.reject(this._storedError);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._cachedChunks.length = 0;\n }\n\n _onProgress(evt) {\n this.onProgress?.({\n loaded: evt.loaded,\n total: evt.lengthComputable ? evt.total : this._contentLength,\n });\n }\n\n get filename() {\n return this._filename;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n async read() {\n await this._headersCapability.promise;\n\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._cachedChunks.length > 0) {\n const chunk = this._cachedChunks.shift();\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n this._headersCapability.reject(reason);\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._fullRequestId)) {\n this._manager.abortRequest(this._fullRequestId);\n }\n this._fullRequestReader = null;\n }\n}\n\n/** @implements {IPDFStreamRangeReader} */\nclass PDFNetworkStreamRangeRequestReader {\n constructor(manager, begin, end) {\n this._manager = manager;\n\n this._url = manager.url;\n this._requestId = manager.request({\n begin,\n end,\n onHeadersReceived: this._onHeadersReceived.bind(this),\n onDone: this._onDone.bind(this),\n onError: this._onError.bind(this),\n onProgress: this._onProgress.bind(this),\n });\n this._requests = [];\n this._queuedChunk = null;\n this._done = false;\n this._storedError = undefined;\n\n this.onProgress = null;\n this.onClosed = null;\n }\n\n _onHeadersReceived() {\n const responseOrigin = getResponseOrigin(\n this._manager.getRequestXhr(this._requestId)?.responseURL\n );\n\n if (responseOrigin !== this._manager._responseOrigin) {\n this._storedError = new Error(\n `Expected range response-origin \"${responseOrigin}\" to match \"${this._manager._responseOrigin}\".`\n );\n this._onError(0);\n }\n }\n\n _close() {\n this.onClosed?.(this);\n }\n\n _onDone(data) {\n const chunk = data.chunk;\n if (this._requests.length > 0) {\n const requestCapability = this._requests.shift();\n requestCapability.resolve({ value: chunk, done: false });\n } else {\n this._queuedChunk = chunk;\n }\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n this._close();\n }\n\n _onError(status) {\n this._storedError ??= createResponseError(status, this._url);\n for (const requestCapability of this._requests) {\n requestCapability.reject(this._storedError);\n }\n this._requests.length = 0;\n this._queuedChunk = null;\n }\n\n _onProgress(evt) {\n if (!this.isStreamingSupported) {\n this.onProgress?.({ loaded: evt.loaded });\n }\n }\n\n get isStreamingSupported() {\n return false;\n }\n\n async read() {\n if (this._storedError) {\n throw this._storedError;\n }\n if (this._queuedChunk !== null) {\n const chunk = this._queuedChunk;\n this._queuedChunk = null;\n return { value: chunk, done: false };\n }\n if (this._done) {\n return { value: undefined, done: true };\n }\n const requestCapability = Promise.withResolvers();\n this._requests.push(requestCapability);\n return requestCapability.promise;\n }\n\n cancel(reason) {\n this._done = true;\n for (const requestCapability of this._requests) {\n requestCapability.resolve({ value: undefined, done: true });\n }\n this._requests.length = 0;\n if (this._manager.isPendingRequest(this._requestId)) {\n this._manager.abortRequest(this._requestId);\n }\n this._close();\n }\n}\n\nexport { PDFNetworkStream };\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/* globals process */\n\nimport { AbortException, assert } from \"../shared/util.js\";\nimport { createResponseError } from \"./network_utils.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\n 'Module \"./node_stream.js\" shall not be used with MOZCENTRAL builds.'\n );\n}\n\nconst urlRegex = /^[a-z][a-z0-9\\-+.]+:/i;\n\nfunction parseUrlOrPath(sourceUrl) {\n if (urlRegex.test(sourceUrl)) {\n return new URL(sourceUrl);\n }\n const url = process.getBuiltinModule(\"url\");\n return new URL(url.pathToFileURL(sourceUrl));\n}\n\nclass PDFNodeStream {\n constructor(source) {\n this.source = source;\n this.url = parseUrlOrPath(source.url);\n assert(\n this.url.protocol === \"file:\",\n \"PDFNodeStream only supports file:// URLs.\"\n );\n\n this._fullRequestReader = null;\n this._rangeRequestReaders = [];\n }\n\n get _progressiveDataLength() {\n return this._fullRequestReader?._loaded ?? 0;\n }\n\n getFullReader() {\n assert(\n !this._fullRequestReader,\n \"PDFNodeStream.getFullReader can only be called once.\"\n );\n this._fullRequestReader = new PDFNodeStreamFsFullReader(this);\n return this._fullRequestReader;\n }\n\n getRangeReader(start, end) {\n if (end <= this._progressiveDataLength) {\n return null;\n }\n const rangeReader = new PDFNodeStreamFsRangeReader(this, start, end);\n this._rangeRequestReaders.push(rangeReader);\n return rangeReader;\n }\n\n cancelAllRequests(reason) {\n this._fullRequestReader?.cancel(reason);\n\n for (const reader of this._rangeRequestReaders.slice(0)) {\n reader.cancel(reason);\n }\n }\n}\n\nclass PDFNodeStreamFsFullReader {\n constructor(stream) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n const source = stream.source;\n this._contentLength = source.length; // optional\n this._loaded = 0;\n this._filename = null;\n\n this._disableRange = source.disableRange || false;\n this._rangeChunkSize = source.rangeChunkSize;\n if (!this._rangeChunkSize && !this._disableRange) {\n this._disableRange = true;\n }\n\n this._isStreamingSupported = !source.disableStream;\n this._isRangeSupported = !source.disableRange;\n\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n this._headersCapability = Promise.withResolvers();\n\n const fs = process.getBuiltinModule(\"fs\");\n fs.promises.lstat(this._url).then(\n stat => {\n // Setting right content length.\n this._contentLength = stat.size;\n\n this._setReadableStream(fs.createReadStream(this._url));\n this._headersCapability.resolve();\n },\n error => {\n if (error.code === \"ENOENT\") {\n error = createResponseError(/* status = */ 0, this._url.href);\n }\n this._storedError = error;\n this._headersCapability.reject(error);\n }\n );\n }\n\n get headersReady() {\n return this._headersCapability.promise;\n }\n\n get filename() {\n return this._filename;\n }\n\n get contentLength() {\n return this._contentLength;\n }\n\n get isRangeSupported() {\n return this._isRangeSupported;\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({\n loaded: this._loaded,\n total: this._contentLength,\n });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readable to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // We need to stop reading when range is supported and streaming is\n // disabled.\n if (!this._isStreamingSupported && this._isRangeSupported) {\n this._error(new AbortException(\"streaming is disabled\"));\n }\n\n // Destroy ReadableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nclass PDFNodeStreamFsRangeReader {\n constructor(stream, start, end) {\n this._url = stream.url;\n this._done = false;\n this._storedError = null;\n this.onProgress = null;\n this._loaded = 0;\n this._readableStream = null;\n this._readCapability = Promise.withResolvers();\n const source = stream.source;\n this._isStreamingSupported = !source.disableStream;\n\n const fs = process.getBuiltinModule(\"fs\");\n this._setReadableStream(\n fs.createReadStream(this._url, { start, end: end - 1 })\n );\n }\n\n get isStreamingSupported() {\n return this._isStreamingSupported;\n }\n\n async read() {\n await this._readCapability.promise;\n if (this._done) {\n return { value: undefined, done: true };\n }\n if (this._storedError) {\n throw this._storedError;\n }\n\n const chunk = this._readableStream.read();\n if (chunk === null) {\n this._readCapability = Promise.withResolvers();\n return this.read();\n }\n this._loaded += chunk.length;\n this.onProgress?.({ loaded: this._loaded });\n\n // Ensure that `read()` method returns ArrayBuffer.\n const buffer = new Uint8Array(chunk).buffer;\n return { value: buffer, done: false };\n }\n\n cancel(reason) {\n // Call `this._error()` method when cancel is called\n // before _readableStream is set.\n if (!this._readableStream) {\n this._error(reason);\n return;\n }\n this._readableStream.destroy(reason);\n }\n\n _error(reason) {\n this._storedError = reason;\n this._readCapability.resolve();\n }\n\n _setReadableStream(readableStream) {\n this._readableStream = readableStream;\n readableStream.on(\"readable\", () => {\n this._readCapability.resolve();\n });\n\n readableStream.on(\"end\", () => {\n // Destroy readableStream to minimize resource usage.\n readableStream.destroy();\n this._done = true;\n this._readCapability.resolve();\n });\n\n readableStream.on(\"error\", reason => {\n this._error(reason);\n });\n\n // Destroy readableStream if already in errored state.\n if (this._storedError) {\n this._readableStream.destroy(this._storedError);\n }\n }\n}\n\nexport { PDFNodeStream };\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\nconst INITIAL_DATA = Symbol(\"INITIAL_DATA\");\n\n/**\n * A PDF document and page is built of many objects. E.g. there are objects for\n * fonts, images, rendering code, etc. These objects may get processed inside of\n * a worker. This class implements some basic methods to manage these objects.\n */\nclass PDFObjects {\n #objs = Object.create(null);\n\n /**\n * Ensures there is an object defined for `objId`.\n *\n * @param {string} objId\n * @returns {Object}\n */\n #ensureObj(objId) {\n return (this.#objs[objId] ||= {\n ...Promise.withResolvers(),\n data: INITIAL_DATA,\n });\n }\n\n /**\n * If called *without* callback, this returns the data of `objId` but the\n * object needs to be resolved. If it isn't, this method throws.\n *\n * If called *with* a callback, the callback is called with the data of the\n * object once the object is resolved. That means, if you call this method\n * and the object is already resolved, the callback gets called right away.\n *\n * @param {string} objId\n * @param {function} [callback]\n * @returns {any}\n */\n get(objId, callback = null) {\n // If there is a callback, then the get can be async and the object is\n // not required to be resolved right now.\n if (callback) {\n const obj = this.#ensureObj(objId);\n obj.promise.then(() => callback(obj.data));\n return null;\n }\n // If there isn't a callback, the user expects to get the resolved data\n // directly.\n const obj = this.#objs[objId];\n // If there isn't an object yet or the object isn't resolved, then the\n // data isn't ready yet!\n if (!obj || obj.data === INITIAL_DATA) {\n throw new Error(`Requesting object that isn't resolved yet ${objId}.`);\n }\n return obj.data;\n }\n\n /**\n * @param {string} objId\n * @returns {boolean}\n */\n has(objId) {\n const obj = this.#objs[objId];\n return !!obj && obj.data !== INITIAL_DATA;\n }\n\n /**\n * @param {string} objId\n * @returns {boolean}\n */\n delete(objId) {\n const obj = this.#objs[objId];\n if (!obj || obj.data === INITIAL_DATA) {\n // Only allow removing the object *after* it's been resolved.\n return false;\n }\n delete this.#objs[objId];\n return true;\n }\n\n /**\n * Resolves the object `objId` with optional `data`.\n *\n * @param {string} objId\n * @param {any} [data]\n */\n resolve(objId, data = null) {\n const obj = this.#ensureObj(objId);\n obj.data = data;\n obj.resolve();\n }\n\n clear() {\n for (const objId in this.#objs) {\n const { data } = this.#objs[objId];\n data?.bitmap?.close(); // Release any `ImageBitmap` data.\n }\n this.#objs = Object.create(null);\n }\n\n *[Symbol.iterator]() {\n for (const objId in this.#objs) {\n const { data } = this.#objs[objId];\n\n if (data === INITIAL_DATA) {\n continue;\n }\n yield [objId, data];\n }\n }\n}\n\nexport { PDFObjects };\n","/* Copyright 2015 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/** @typedef {import(\"./display_utils\").PageViewport} PageViewport */\n/** @typedef {import(\"./api\").TextContent} TextContent */\n\nimport {\n AbortException,\n FeatureTest,\n shadow,\n Util,\n warn,\n} from \"../shared/util.js\";\nimport { OutputScale, setLayerDimensions } from \"./display_utils.js\";\n\n/**\n * @typedef {Object} TextLayerParameters\n * @property {ReadableStream | TextContent} textContentSource - Text content to\n * render, i.e. the value returned by the page's `streamTextContent` or\n * `getTextContent` method.\n * @property {HTMLElement} container - The DOM node that will contain the text\n * runs.\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n */\n\n/**\n * @typedef {Object} TextLayerUpdateParameters\n * @property {PageViewport} viewport - The target viewport to properly layout\n * the text runs.\n * @property {function} [onBefore] - Callback invoked before the textLayer is\n * updated in the DOM.\n */\n\nconst MAX_TEXT_DIVS_TO_RENDER = 100000;\nconst DEFAULT_FONT_SIZE = 30;\n\nclass TextLayer {\n #capability = Promise.withResolvers();\n\n #container = null;\n\n #disableProcessItems = false;\n\n #fontInspectorEnabled = !!globalThis.FontInspector?.enabled;\n\n #lang = null;\n\n #layoutTextParams = null;\n\n #pageHeight = 0;\n\n #pageWidth = 0;\n\n #reader = null;\n\n #rootContainer = null;\n\n #rotation = 0;\n\n #scale = 0;\n\n #styleCache = Object.create(null);\n\n #textContentItemsStr = [];\n\n #textContentSource = null;\n\n #textDivs = [];\n\n #textDivProperties = new WeakMap();\n\n #transform = null;\n\n static #ascentCache = new Map();\n\n static #canvasContexts = new Map();\n\n static #canvasCtxFonts = new WeakMap();\n\n static #minFontSize = null;\n\n static #pendingTextLayers = new Set();\n\n /**\n * @param {TextLayerParameters} options\n */\n constructor({ textContentSource, container, viewport }) {\n if (textContentSource instanceof ReadableStream) {\n this.#textContentSource = textContentSource;\n } else if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n typeof textContentSource === \"object\"\n ) {\n this.#textContentSource = new ReadableStream({\n start(controller) {\n controller.enqueue(textContentSource);\n controller.close();\n },\n });\n } else {\n throw new Error('No \"textContentSource\" parameter specified.');\n }\n this.#container = this.#rootContainer = container;\n\n this.#scale = viewport.scale * OutputScale.pixelRatio;\n this.#rotation = viewport.rotation;\n this.#layoutTextParams = {\n div: null,\n properties: null,\n ctx: null,\n };\n const { pageWidth, pageHeight, pageX, pageY } = viewport.rawDims;\n this.#transform = [1, 0, 0, -1, -pageX, pageY + pageHeight];\n this.#pageWidth = pageWidth;\n this.#pageHeight = pageHeight;\n\n TextLayer.#ensureMinFontSizeComputed();\n\n setLayerDimensions(container, viewport);\n\n // Always clean-up the temporary canvas once rendering is no longer pending.\n this.#capability.promise\n .finally(() => {\n TextLayer.#pendingTextLayers.delete(this);\n this.#layoutTextParams = null;\n this.#styleCache = null;\n })\n .catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"pageWidth\", {\n get() {\n return this.#pageWidth;\n },\n });\n Object.defineProperty(this, \"pageHeight\", {\n get() {\n return this.#pageHeight;\n },\n });\n }\n }\n\n static get fontFamilyMap() {\n const { isWindows, isFirefox } = FeatureTest.platform;\n return shadow(\n this,\n \"fontFamilyMap\",\n new Map([\n [\n \"sans-serif\",\n `${isWindows && isFirefox ? \"Calibri, \" : \"\"}sans-serif`,\n ],\n [\n \"monospace\",\n `${isWindows && isFirefox ? \"Lucida Console, \" : \"\"}monospace`,\n ],\n ])\n );\n }\n\n /**\n * Render the textLayer.\n * @returns {Promise}\n */\n render() {\n const pump = () => {\n this.#reader.read().then(({ value, done }) => {\n if (done) {\n this.#capability.resolve();\n return;\n }\n this.#lang ??= value.lang;\n Object.assign(this.#styleCache, value.styles);\n this.#processItems(value.items);\n pump();\n }, this.#capability.reject);\n };\n this.#reader = this.#textContentSource.getReader();\n TextLayer.#pendingTextLayers.add(this);\n pump();\n\n return this.#capability.promise;\n }\n\n /**\n * Update a previously rendered textLayer, if necessary.\n * @param {TextLayerUpdateParameters} options\n * @returns {undefined}\n */\n update({ viewport, onBefore = null }) {\n const scale = viewport.scale * OutputScale.pixelRatio;\n const rotation = viewport.rotation;\n\n if (rotation !== this.#rotation) {\n onBefore?.();\n this.#rotation = rotation;\n setLayerDimensions(this.#rootContainer, { rotation });\n }\n\n if (scale !== this.#scale) {\n onBefore?.();\n this.#scale = scale;\n const params = {\n div: null,\n properties: null,\n ctx: TextLayer.#getCtx(this.#lang),\n };\n for (const div of this.#textDivs) {\n params.properties = this.#textDivProperties.get(div);\n params.div = div;\n this.#layout(params);\n }\n }\n }\n\n /**\n * Cancel rendering of the textLayer.\n * @returns {undefined}\n */\n cancel() {\n const abortEx = new AbortException(\"TextLayer task cancelled.\");\n\n this.#reader?.cancel(abortEx).catch(() => {\n // Avoid \"Uncaught promise\" messages in the console.\n });\n this.#reader = null;\n\n this.#capability.reject(abortEx);\n }\n\n /**\n * @type {Array} HTML elements that correspond to the text items\n * of the textContent input.\n * This is output and will initially be set to an empty array.\n */\n get textDivs() {\n return this.#textDivs;\n }\n\n /**\n * @type {Array} Strings that correspond to the `str` property of\n * the text items of the textContent input.\n * This is output and will initially be set to an empty array\n */\n get textContentItemsStr() {\n return this.#textContentItemsStr;\n }\n\n #processItems(items) {\n if (this.#disableProcessItems) {\n return;\n }\n this.#layoutTextParams.ctx ??= TextLayer.#getCtx(this.#lang);\n\n const textDivs = this.#textDivs,\n textContentItemsStr = this.#textContentItemsStr;\n\n for (const item of items) {\n // No point in rendering many divs as it would make the browser\n // unusable even after the divs are rendered.\n if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {\n warn(\"Ignoring additional textDivs for performance reasons.\");\n\n this.#disableProcessItems = true; // Avoid multiple warnings for one page.\n return;\n }\n\n if (item.str === undefined) {\n if (\n item.type === \"beginMarkedContentProps\" ||\n item.type === \"beginMarkedContent\"\n ) {\n const parent = this.#container;\n this.#container = document.createElement(\"span\");\n this.#container.classList.add(\"markedContent\");\n if (item.id) {\n this.#container.setAttribute(\"id\", `${item.id}`);\n }\n parent.append(this.#container);\n } else if (item.type === \"endMarkedContent\") {\n this.#container = this.#container.parentNode;\n }\n continue;\n }\n textContentItemsStr.push(item.str);\n this.#appendText(item);\n }\n }\n\n #appendText(geom) {\n // Initialize all used properties to keep the caches monomorphic.\n const textDiv = document.createElement(\"span\");\n const textDivProperties = {\n angle: 0,\n canvasWidth: 0,\n hasText: geom.str !== \"\",\n hasEOL: geom.hasEOL,\n fontSize: 0,\n };\n this.#textDivs.push(textDiv);\n\n const tx = Util.transform(this.#transform, geom.transform);\n let angle = Math.atan2(tx[1], tx[0]);\n const style = this.#styleCache[geom.fontName];\n if (style.vertical) {\n angle += Math.PI / 2;\n }\n\n let fontFamily =\n (this.#fontInspectorEnabled && style.fontSubstitution) ||\n style.fontFamily;\n\n // Workaround for bug 1922063.\n fontFamily = TextLayer.fontFamilyMap.get(fontFamily) || fontFamily;\n const fontHeight = Math.hypot(tx[2], tx[3]);\n const fontAscent =\n fontHeight * TextLayer.#getAscent(fontFamily, style, this.#lang);\n\n let left, top;\n if (angle === 0) {\n left = tx[4];\n top = tx[5] - fontAscent;\n } else {\n left = tx[4] + fontAscent * Math.sin(angle);\n top = tx[5] - fontAscent * Math.cos(angle);\n }\n\n const scaleFactorStr = \"calc(var(--total-scale-factor) *\";\n const divStyle = textDiv.style;\n // Setting the style properties individually, rather than all at once,\n // should be OK since the `textDiv` isn't appended to the document yet.\n if (this.#container === this.#rootContainer) {\n divStyle.left = `${((100 * left) / this.#pageWidth).toFixed(2)}%`;\n divStyle.top = `${((100 * top) / this.#pageHeight).toFixed(2)}%`;\n } else {\n // We're in a marked content span, hence we can't use percents.\n divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;\n divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;\n }\n // We multiply the font size by #minFontSize, and then #layout will\n // scale the element by 1/#minFontSize. This allows us to effectively\n // ignore the minimum font size enforced by the browser, so that the text\n // layer s can always match the size of the text in the canvas.\n divStyle.fontSize = `${scaleFactorStr}${(TextLayer.#minFontSize * fontHeight).toFixed(2)}px)`;\n divStyle.fontFamily = fontFamily;\n\n textDivProperties.fontSize = fontHeight;\n\n // Keeps screen readers from pausing on every new text span.\n textDiv.setAttribute(\"role\", \"presentation\");\n\n textDiv.textContent = geom.str;\n // geom.dir may be 'ttb' for vertical texts.\n textDiv.dir = geom.dir;\n\n // `fontName` is only used by the FontInspector, and we only use `dataset`\n // here to make the font name available in the debugger.\n if (this.#fontInspectorEnabled) {\n textDiv.dataset.fontName =\n style.fontSubstitutionLoadedName || geom.fontName;\n }\n if (angle !== 0) {\n textDivProperties.angle = angle * (180 / Math.PI);\n }\n // We don't bother scaling single-char text divs, because it has very\n // little effect on text highlighting. This makes scrolling on docs with\n // lots of such divs a lot faster.\n let shouldScaleText = false;\n if (geom.str.length > 1) {\n shouldScaleText = true;\n } else if (geom.str !== \" \" && geom.transform[0] !== geom.transform[3]) {\n const absScaleX = Math.abs(geom.transform[0]),\n absScaleY = Math.abs(geom.transform[3]);\n // When the horizontal/vertical scaling differs significantly, also scale\n // even single-char text to improve highlighting (fixes issue11713.pdf).\n if (\n absScaleX !== absScaleY &&\n Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5\n ) {\n shouldScaleText = true;\n }\n }\n if (shouldScaleText) {\n textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;\n }\n this.#textDivProperties.set(textDiv, textDivProperties);\n\n // Finally, layout and append the text to the DOM.\n this.#layoutTextParams.div = textDiv;\n this.#layoutTextParams.properties = textDivProperties;\n this.#layout(this.#layoutTextParams);\n\n if (textDivProperties.hasText) {\n this.#container.append(textDiv);\n }\n if (textDivProperties.hasEOL) {\n const br = document.createElement(\"br\");\n br.setAttribute(\"role\", \"presentation\");\n this.#container.append(br);\n }\n }\n\n #layout(params) {\n const { div, properties, ctx } = params;\n const { style } = div;\n\n let transform = \"\";\n if (TextLayer.#minFontSize > 1) {\n transform = `scale(${1 / TextLayer.#minFontSize})`;\n }\n\n if (properties.canvasWidth !== 0 && properties.hasText) {\n const { fontFamily } = style;\n const { canvasWidth, fontSize } = properties;\n\n TextLayer.#ensureCtxFont(ctx, fontSize * this.#scale, fontFamily);\n // Only measure the width for multi-char text divs, see `appendText`.\n const { width } = ctx.measureText(div.textContent);\n\n if (width > 0) {\n transform = `scaleX(${(canvasWidth * this.#scale) / width}) ${transform}`;\n }\n }\n if (properties.angle !== 0) {\n transform = `rotate(${properties.angle}deg) ${transform}`;\n }\n if (transform.length > 0) {\n style.transform = transform;\n }\n }\n\n /**\n * Clean-up global textLayer data.\n * @returns {undefined}\n */\n static cleanup() {\n if (this.#pendingTextLayers.size > 0) {\n return;\n }\n this.#ascentCache.clear();\n\n for (const { canvas } of this.#canvasContexts.values()) {\n canvas.remove();\n }\n this.#canvasContexts.clear();\n }\n\n static #getCtx(lang = null) {\n let ctx = this.#canvasContexts.get((lang ||= \"\"));\n if (!ctx) {\n // We don't use an OffscreenCanvas here because we use serif/sans serif\n // fonts with it and they depends on the locale.\n // In Firefox, the element get a lang attribute that depends on\n // what Fluent returns for the locale and the OffscreenCanvas uses\n // the OS locale.\n // Those two locales can be different and consequently the used fonts will\n // be different (see bug 1869001).\n // Ideally, we should use in the text layer the fonts we've in the pdf (or\n // their replacements when they aren't embedded) and then we can use an\n // OffscreenCanvas.\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"hiddenCanvasElement\";\n canvas.lang = lang;\n document.body.append(canvas);\n ctx = canvas.getContext(\"2d\", {\n alpha: false,\n willReadFrequently: true,\n });\n this.#canvasContexts.set(lang, ctx);\n\n // Also, initialize state for the `#ensureCtxFont` method.\n this.#canvasCtxFonts.set(ctx, { size: 0, family: \"\" });\n }\n return ctx;\n }\n\n static #ensureCtxFont(ctx, size, family) {\n const cached = this.#canvasCtxFonts.get(ctx);\n if (size === cached.size && family === cached.family) {\n return; // The font is already set.\n }\n ctx.font = `${size}px ${family}`;\n cached.size = size;\n cached.family = family;\n }\n\n /**\n * Compute the minimum font size enforced by the browser.\n */\n static #ensureMinFontSizeComputed() {\n if (this.#minFontSize !== null) {\n return;\n }\n const div = document.createElement(\"div\");\n div.style.opacity = 0;\n div.style.lineHeight = 1;\n div.style.fontSize = \"1px\";\n div.style.position = \"absolute\";\n div.textContent = \"X\";\n document.body.append(div);\n // In `display:block` elements contain a single line of text,\n // the height matches the line height (which, when set to 1,\n // matches the actual font size).\n this.#minFontSize = div.getBoundingClientRect().height;\n div.remove();\n }\n\n static #getAscent(fontFamily, style, lang) {\n const cachedAscent = this.#ascentCache.get(fontFamily);\n if (cachedAscent) {\n return cachedAscent;\n }\n const ctx = this.#getCtx(lang);\n\n ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;\n this.#ensureCtxFont(ctx, DEFAULT_FONT_SIZE, fontFamily);\n const metrics = ctx.measureText(\"\");\n\n const ascent = metrics.fontBoundingBoxAscent;\n const descent = Math.abs(metrics.fontBoundingBoxDescent);\n\n ctx.canvas.width = ctx.canvas.height = 0;\n let ratio = 0.8; // DEFAULT_FONT_ASCENT\n\n if (ascent) {\n ratio = ascent / (ascent + descent);\n } else {\n if (\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n FeatureTest.platform.isFirefox\n ) {\n warn(\n \"Enable the `dom.textMetrics.fontBoundingBox.enabled` preference \" +\n \"in `about:config` to improve TextLayer rendering.\"\n );\n }\n if (style.ascent) {\n ratio = style.ascent;\n } else if (style.descent) {\n ratio = 1 + style.descent;\n }\n }\n\n this.#ascentCache.set(fontFamily, ratio);\n return ratio;\n }\n}\n\nexport { TextLayer };\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 FeatureTest,\n getVerbosityLevel,\n info,\n isNodeJS,\n RenderingIntentFlag,\n setVerbosityLevel,\n shadow,\n unreachable,\n warn,\n} from \"../shared/util.js\";\nimport {\n AnnotationStorage,\n PrintAnnotationStorage,\n SerializableEmpty,\n} from \"./annotation_storage.js\";\nimport {\n deprecated,\n isDataScheme,\n isValidFetchUrl,\n PageViewport,\n RenderingCancelledException,\n StatTimer,\n} from \"./display_utils.js\";\nimport { FontFaceObject, FontLoader } from \"./font_loader.js\";\nimport {\n getDataProp,\n getFactoryUrlProp,\n getUrlProp,\n isRefProxy,\n LoopbackPort,\n} from \"./api_utils.js\";\nimport { MessageHandler, wrapReason } from \"../shared/message_handler.js\";\nimport {\n NodeCanvasFactory,\n NodeCMapReaderFactory,\n NodeFilterFactory,\n NodeStandardFontDataFactory,\n NodeWasmFactory,\n} from \"display-node_utils\";\nimport { CanvasDependencyTracker } from \"./canvas_dependency_tracker.js\";\nimport { CanvasGraphics } from \"./canvas.js\";\nimport { DOMCanvasFactory } from \"./canvas_factory.js\";\nimport { DOMCMapReaderFactory } from \"display-cmap_reader_factory\";\nimport { DOMFilterFactory } from \"./filter_factory.js\";\nimport { DOMStandardFontDataFactory } from \"display-standard_fontdata_factory\";\nimport { DOMWasmFactory } from \"display-wasm_factory\";\nimport { FontInfo } from \"../shared/obj-bin-transform.js\";\nimport { GlobalWorkerOptions } from \"./worker_options.js\";\nimport { Metadata } from \"./metadata.js\";\nimport { OptionalContentConfig } from \"./optional_content_config.js\";\nimport { PDFDataTransportStream } from \"./transport_stream.js\";\nimport { PDFFetchStream } from \"display-fetch_stream\";\nimport { PDFNetworkStream } from \"display-network\";\nimport { PDFNodeStream } from \"display-node_stream\";\nimport { PDFObjects } from \"./pdf_objects.js\";\nimport { TextLayer } from \"./text_layer.js\";\nimport { XfaText } from \"./xfa_text.js\";\n\nconst RENDERING_CANCELLED_TIMEOUT = 100; // ms\n\n/**\n * @typedef { Int8Array | Uint8Array | Uint8ClampedArray |\n * Int16Array | Uint16Array |\n * Int32Array | Uint32Array | Float32Array |\n * Float64Array\n * } TypedArray\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 {TypedArray | ArrayBuffer | Array | string} [data] -\n * 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 65536 (= 2^16).\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. The default value is `true`.\n * @property {Object} [CMapReaderFactory] - The factory that will be used when\n * reading built-in CMap files.\n * The default value is {DOMCMapReaderFactory}.\n * @property {string} [iccUrl] - The URL where the predefined ICC profiles are\n * located. Include the trailing slash.\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.\n * The default value is {DOMStandardFontDataFactory}.\n * @property {string} [wasmUrl] - The URL where the wasm files are located.\n * Include the trailing slash.\n * @property {Object} [WasmFactory] - The factory that will be used\n * when reading the wasm files.\n * The default value is {DOMWasmFactory}.\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`, `StandardFontDataFactory`, and `WasmFactory`\n * options are ignored.\n * The default value is `true` in web environments and `false` in Node.js.\n * @property {boolean} [useWasm] - Attempt to use WebAssembly in order to\n * improve e.g. image decoding performance.\n * The default value is `true`.\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 PDF functions.\n * 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} [isImageDecoderSupported] - Determines if we can use\n * `ImageDecoder` 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 *\n * NOTE: Also temporarily disabled in Chromium browsers, until we no longer\n * support the affected browser versions, because of various bugs:\n *\n * - Crashes when using the BMP decoder with huge images, e.g. issue6741.pdf;\n * see https://issues.chromium.org/issues/374807001\n *\n * - Broken images when using the JPEG decoder with images that have custom\n * colour profiles, e.g. GitHub discussion 19030;\n * see https://issues.chromium.org/issues/378869810\n *\n * @property {number} [canvasMaxAreaInBytes] - The integer value is used to\n * know when an image must be resized (uses `OffscreenCanvas` in the worker).\n * If it's -1 then a possibly slow algorithm is used to guess the max value.\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 * @property {Object} [CanvasFactory] - The factory that will be used when\n * creating canvases. The default value is {DOMCanvasFactory}.\n * @property {Object} [FilterFactory] - The factory that will be used to\n * create SVG filters when rendering some images on the main canvas.\n * The default value is {DOMFilterFactory}.\n * @property {boolean} [enableHWA] - Enables hardware acceleration for\n * rendering. 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 (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {\n src = { data: src };\n }\n }\n const task = new PDFDocumentLoadingTask();\n const { docId } = task;\n\n const url = src.url ? getUrlProp(src.url) : null;\n const data = src.data ? getDataProp(src.data) : null;\n const httpHeaders = src.httpHeaders || null;\n const withCredentials = src.withCredentials === true;\n const password = src.password ?? null;\n const rangeTransport =\n src.range instanceof PDFDataRangeTransport ? src.range : null;\n const rangeChunkSize =\n Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0\n ? src.rangeChunkSize\n : 2 ** 16;\n let worker = src.worker instanceof PDFWorker ? src.worker : null;\n const verbosity = src.verbosity;\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 const docBaseUrl =\n typeof src.docBaseUrl === \"string\" && !isDataScheme(src.docBaseUrl)\n ? src.docBaseUrl\n : null;\n const cMapUrl = getFactoryUrlProp(src.cMapUrl);\n const cMapPacked = src.cMapPacked !== false;\n const CMapReaderFactory =\n src.CMapReaderFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCMapReaderFactory\n : DOMCMapReaderFactory);\n const iccUrl = getFactoryUrlProp(src.iccUrl);\n const standardFontDataUrl = getFactoryUrlProp(src.standardFontDataUrl);\n const StandardFontDataFactory =\n src.StandardFontDataFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeStandardFontDataFactory\n : DOMStandardFontDataFactory);\n const wasmUrl = getFactoryUrlProp(src.wasmUrl);\n const WasmFactory =\n src.WasmFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeWasmFactory\n : DOMWasmFactory);\n const ignoreErrors = src.stopAtErrors !== true;\n const maxImageSize =\n Number.isInteger(src.maxImageSize) && src.maxImageSize > -1\n ? src.maxImageSize\n : -1;\n const isEvalSupported = src.isEvalSupported !== false;\n const isOffscreenCanvasSupported =\n typeof src.isOffscreenCanvasSupported === \"boolean\"\n ? src.isOffscreenCanvasSupported\n : !isNodeJS;\n const isImageDecoderSupported =\n // eslint-disable-next-line no-nested-ternary\n typeof src.isImageDecoderSupported === \"boolean\"\n ? src.isImageDecoderSupported\n : // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? true\n : typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n ? false\n : !isNodeJS && (FeatureTest.platform.isFirefox || !globalThis.chrome);\n const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes)\n ? src.canvasMaxAreaInBytes\n : -1;\n const disableFontFace =\n typeof src.disableFontFace === \"boolean\" ? src.disableFontFace : isNodeJS;\n const fontExtraProperties = src.fontExtraProperties === true;\n const enableXfa = src.enableXfa === true;\n const ownerDocument = src.ownerDocument || globalThis.document;\n const disableRange = src.disableRange === true;\n const disableStream = src.disableStream === true;\n const disableAutoFetch = src.disableAutoFetch === true;\n const pdfBug = src.pdfBug === true;\n const CanvasFactory =\n src.CanvasFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeCanvasFactory\n : DOMCanvasFactory);\n const FilterFactory =\n src.FilterFactory ||\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"GENERIC\") && isNodeJS\n ? NodeFilterFactory\n : DOMFilterFactory);\n const enableHWA = src.enableHWA === true;\n const useWasm = src.useWasm !== false;\n\n // Parameters whose default values depend on other parameters.\n const length = rangeTransport ? rangeTransport.length : (src.length ?? NaN);\n const useSystemFonts =\n typeof src.useSystemFonts === \"boolean\"\n ? src.useSystemFonts\n : !isNodeJS && !disableFontFace;\n const useWorkerFetch =\n typeof src.useWorkerFetch === \"boolean\"\n ? src.useWorkerFetch\n : (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n !!(\n CMapReaderFactory === DOMCMapReaderFactory &&\n StandardFontDataFactory === DOMStandardFontDataFactory &&\n WasmFactory === DOMWasmFactory &&\n cMapUrl &&\n standardFontDataUrl &&\n wasmUrl &&\n isValidFetchUrl(cMapUrl, document.baseURI) &&\n isValidFetchUrl(standardFontDataUrl, document.baseURI) &&\n isValidFetchUrl(wasmUrl, document.baseURI)\n );\n\n // Parameters only intended for development/testing purposes.\n const styleElement =\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")\n ? src.styleElement\n : null;\n\n // Set the main-thread verbosity level.\n setVerbosityLevel(verbosity);\n\n // Ensure that the various factories can be initialized, when necessary,\n // since the user may provide *custom* ones.\n const transportFactory = {\n canvasFactory: new CanvasFactory({ ownerDocument, enableHWA }),\n filterFactory: new FilterFactory({ docId, ownerDocument }),\n cMapReaderFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new CMapReaderFactory({ baseUrl: cMapUrl, isCompressed: cMapPacked }),\n standardFontDataFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new StandardFontDataFactory({ baseUrl: standardFontDataUrl }),\n wasmFactory:\n (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) ||\n useWorkerFetch\n ? null\n : new WasmFactory({ baseUrl: wasmUrl }),\n };\n\n if (!worker) {\n // Worker was not provided -- creating and owning our own. If message port\n // is specified in global worker options, using it.\n worker = PDFWorker.create({\n verbosity,\n port: GlobalWorkerOptions.workerPort,\n });\n task._worker = worker;\n }\n\n const docParams = {\n docId,\n apiVersion:\n typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"TESTING\")\n ? PDFJSDev.eval(\"BUNDLE_VERSION\")\n : null,\n data,\n password,\n disableAutoFetch,\n rangeChunkSize,\n length,\n docBaseUrl,\n enableXfa,\n evaluatorOptions: {\n maxImageSize,\n disableFontFace,\n ignoreErrors,\n isEvalSupported,\n isOffscreenCanvasSupported,\n isImageDecoderSupported,\n canvasMaxAreaInBytes,\n fontExtraProperties,\n useSystemFonts,\n useWasm,\n useWorkerFetch,\n cMapUrl,\n iccUrl,\n standardFontDataUrl,\n wasmUrl,\n },\n };\n const transportParams = {\n ownerDocument,\n pdfBug,\n styleElement,\n loadingParams: {\n disableAutoFetch,\n enableXfa,\n },\n };\n\n worker.promise\n .then(function () {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const workerIdPromise = worker.messageHandler.sendWithPromise(\n \"GetDocRequest\",\n docParams,\n data ? [data.buffer] : null\n );\n\n let networkStream;\n if (rangeTransport) {\n networkStream = new PDFDataTransportStream(rangeTransport, {\n disableRange,\n disableStream,\n });\n } else if (!data) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: NetworkStream\");\n }\n if (!url) {\n throw new Error(\"getDocument - no `url` parameter provided.\");\n }\n // eslint-disable-next-line no-nested-ternary\n const NetworkStream = isValidFetchUrl(url)\n ? PDFFetchStream\n : typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"GENERIC\") &&\n isNodeJS\n ? PDFNodeStream\n : PDFNetworkStream;\n\n networkStream = new NetworkStream({\n url,\n length,\n httpHeaders,\n withCredentials,\n rangeChunkSize,\n disableRange,\n disableStream,\n });\n }\n\n return workerIdPromise.then(workerId => {\n if (task.destroyed) {\n throw new Error(\"Loading aborted\");\n }\n if (worker.destroyed) {\n throw new Error(\"Worker was destroyed\");\n }\n\n const messageHandler = new MessageHandler(docId, workerId, worker.port);\n const transport = new WorkerTransport(\n messageHandler,\n task,\n networkStream,\n transportParams,\n transportFactory,\n enableHWA\n );\n task._transport = transport;\n messageHandler.send(\"Ready\", null);\n });\n })\n .catch(task._capability.reject);\n\n return task;\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 /**\n * @private\n */\n _capability = Promise.withResolvers();\n\n /**\n * @private\n */\n _transport = null;\n\n /**\n * @private\n */\n _worker = null;\n\n /**\n * Unique identifier for the document loading task.\n * @type {string}\n */\n docId = `d${PDFDocumentLoadingTask.#docId++}`;\n\n /**\n * Whether the loading task is destroyed or not.\n * @type {boolean}\n */\n 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 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 onProgress = null;\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\n try {\n if (this._worker?.port) {\n this._worker._pendingDestroy = true;\n }\n await this._transport?.destroy();\n } catch (ex) {\n if (this._worker?.port) {\n delete this._worker._pendingDestroy;\n }\n throw ex;\n }\n this._transport = null;\n\n this._worker?.destroy();\n this._worker = null;\n }\n\n /**\n * Attempt to fetch the raw data of the PDF document, when e.g.\n * - An exception was thrown during document initialization.\n * - An `onPassword` callback is delaying initialization.\n * @returns {Promise}\n */\n async getData() {\n return this._transport.getData();\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 #capability = Promise.withResolvers();\n\n #progressiveDoneListeners = [];\n\n #progressiveReadListeners = [];\n\n #progressListeners = [];\n\n #rangeListeners = [];\n\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\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.#capability.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.#capability.promise.then(() => {\n for (const listener of this.#progressiveReadListeners) {\n listener(chunk);\n }\n });\n }\n\n onDataProgressiveDone() {\n this.#capability.promise.then(() => {\n for (const listener of this.#progressiveDoneListeners) {\n listener();\n }\n });\n }\n\n transportReady() {\n this.#capability.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 if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"getNetworkStreamName\", {\n value: () => this._transport.getNetworkStreamName(),\n });\n Object.defineProperty(this, \"getXFADatasets\", {\n value: () => this._transport.getXFADatasets(),\n });\n Object.defineProperty(this, \"getStartXRefPos\", {\n value: () => this._transport.getStartXRefPos(),\n });\n Object.defineProperty(this, \"getAnnotArray\", {\n value: pageIndex => this._transport.getAnnotArray(pageIndex),\n });\n }\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 {Object} The canvas factory instance.\n */\n get canvasFactory() {\n return this._transport.canvasFactory;\n }\n\n /**\n * @type {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\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 identify\n * 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 * @param {Set} types - The annotation types to retrieve.\n * @param {Set} pageIndexesToSkip\n * @returns {Promise>} A promise that is resolved with a list of\n * annotations data.\n */\n getAnnotationsByType(types, pageIndexesToSkip) {\n return this._transport.getAnnotationsByType(types, pageIndexesToSkip);\n }\n\n /**\n * @returns {Promise} A promise that is resolved with\n * an {Object} with the JavaScript actions:\n * - from the name tree.\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 * @typedef {Object} GetOptionalContentConfigParameters\n * @property {string} [intent] - Determines the optional content groups that\n * are visible by default; valid values are:\n * - 'display' (viewable groups).\n * - 'print' (printable groups).\n * - 'any' (all groups).\n * The default value is 'display'.\n */\n\n /**\n * @param {GetOptionalContentConfigParameters} [params] - Optional content\n * config parameters.\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({ intent = \"display\" } = {}) {\n const { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getOptionalContentConfig(renderingIntent);\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 * @param {RefProxy} ref - The page reference.\n * @returns {number | null} The page number, if it's cached.\n */\n cachedPageNumber(ref) {\n return this._transport.cachedPageNumber(ref);\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} [includeMarkedContent] - When true include marked\n * content items in the items array of TextContent. The default is `false`.\n * @property {boolean} [disableNormalization] - When true the text is *not*\n * normalized in the worker-thread. 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 * @property {string | null} lang - The document /Lang attribute.\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 {HTMLCanvasElement|null} canvas - A DOM Canvas object. The default\n * value is the canvas associated with the `canvasContext` parameter if no\n * value is provided explicitly.\n * @property {PageViewport} viewport - Rendering viewport obtained by calling\n * the `PDFPageProxy.getViewport` method.\n * @property {CanvasRenderingContext2D} [canvasContext] - 2D context of a DOM\n * Canvas object for backwards compatibility; it is recommended to use the\n * `canvas` parameter instead.\n * If the context must absolutely be used to render the page, the canvas must\n * be null.\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 {CanvasGradient | CanvasPattern | string} [background] - Background\n * 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 * @property {boolean} [isEditing] - Render the page in editing mode.\n * @property {boolean} [recordOperations] - Record the dependencies and bounding\n * boxes of all PDF operations that render onto the canvas.\n * @property {OperationsFilter} [operationsFilter] - If provided, only\n * run for which this function returns `true`.\n */\n\n/**\n * @callback OperationsFilter\n * @param {number} index - The index of the operation.\n * @returns {boolean} If false, the operation is ignored.\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 * @property {boolean} [isEditing] - Render the page in editing mode.\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 #pendingCleanup = false;\n\n constructor(pageIndex, pageInfo, transport, pdfBug = false) {\n this._pageIndex = pageIndex;\n this._pageInfo = pageInfo;\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._intentStates = new Map();\n this.destroyed = false;\n this.recordedBBoxes = null;\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 userUnit: this.userUnit,\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 { renderingIntent } = this._transport.getRenderingIntent(intent);\n\n return this._transport.getAnnotations(this._pageIndex, renderingIntent);\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 {Object} The filter factory instance.\n */\n get filterFactory() {\n return this._transport.filterFactory;\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 canvas = canvasContext.canvas,\n viewport,\n intent = \"display\",\n annotationMode = AnnotationMode.ENABLE,\n transform = null,\n background = null,\n optionalContentConfigPromise = null,\n annotationCanvasMap = null,\n pageColors = null,\n printAnnotationStorage = null,\n isEditing = false,\n recordOperations = false,\n operationsFilter = null,\n }) {\n this._stats?.time(\"Overall\");\n\n const intentArgs = this._transport.getRenderingIntent(\n intent,\n annotationMode,\n printAnnotationStorage,\n isEditing\n );\n const { renderingIntent, cacheKey } = intentArgs;\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 optionalContentConfigPromise ||=\n this._transport.getOptionalContentConfig(renderingIntent);\n\n let intentState = this._intentStates.get(cacheKey);\n if (!intentState) {\n intentState = Object.create(null);\n this._intentStates.set(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 intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);\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 = Promise.withResolvers();\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 recordForDebugger = Boolean(\n this._pdfBug && globalThis.StepperManager?.enabled\n );\n\n const shouldRecordOperations =\n !this.recordedBBoxes && (recordOperations || recordForDebugger);\n\n const complete = error => {\n intentState.renderTasks.delete(internalRenderTask);\n\n if (shouldRecordOperations) {\n const recordedBBoxes = internalRenderTask.gfx?.dependencyTracker.take();\n if (recordedBBoxes) {\n if (internalRenderTask.stepper) {\n internalRenderTask.stepper.setOperatorBBoxes(\n recordedBBoxes,\n internalRenderTask.gfx.dependencyTracker.takeDebugMetadata()\n );\n }\n if (recordOperations) {\n this.recordedBBoxes = recordedBBoxes;\n }\n }\n }\n\n // Attempt to reduce memory usage during *printing*, by always running\n // cleanup immediately once rendering has finished.\n if (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 if (this._stats) {\n this._stats.timeEnd(\"Rendering\");\n this._stats.timeEnd(\"Overall\");\n\n if (globalThis.Stats?.enabled) {\n globalThis.Stats.add(this.pageNumber, this._stats);\n }\n }\n };\n\n const internalRenderTask = new InternalRenderTask({\n callback: complete,\n // Only include the required properties, and *not* the entire object.\n params: {\n canvas,\n canvasContext,\n dependencyTracker: shouldRecordOperations\n ? new CanvasDependencyTracker(\n canvas,\n intentState.operatorList.length,\n recordForDebugger\n )\n : null,\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: this._transport.canvasFactory,\n filterFactory: this._transport.filterFactory,\n useRequestAnimationFrame: !intentPrint,\n pdfBug: this._pdfBug,\n pageColors,\n enableHWA: this._transport.enableHWA,\n operationsFilter,\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.destroyed) {\n complete();\n return;\n }\n this._stats?.time(\"Rendering\");\n\n if (!(optionalContentConfig.renderingIntent & renderingIntent)) {\n throw new Error(\n \"Must use the same `intent`-argument when calling the `PDFPageProxy.render` \" +\n \"and `PDFDocumentProxy.getOptionalContentConfig` methods.\"\n );\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 isEditing = false,\n } = {}) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\"Not implemented: getOperatorList\");\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 isEditing,\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 = Promise.withResolvers();\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 includeMarkedContent = false,\n disableNormalization = false,\n } = {}) {\n const TEXT_CONTENT_CHUNK_SIZE = 100;\n\n return this._transport.messageHandler.sendWithStream(\n \"GetTextContent\",\n {\n pageIndex: this._pageIndex,\n includeMarkedContent: includeMarkedContent === true,\n disableNormalization: disableNormalization === 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 => XfaText.textContent(xfa));\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 textContent.lang ??= value.lang;\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 lang: 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 this.#pendingCleanup = false;\n\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 const success = this.#tryCleanup();\n\n if (resetStats && success) {\n this._stats &&= new StatTimer();\n }\n return success;\n }\n\n /**\n * Attempts to clean up if rendering is in a state where that's possible.\n * @returns {boolean} Indicates if clean-up was successfully run.\n */\n #tryCleanup() {\n if (!this.#pendingCleanup || this.destroyed) {\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 this._intentStates.clear();\n this.objs.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({\n renderingIntent,\n cacheKey,\n annotationStorageSerializable,\n modifiedIds,\n }) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n assert(\n Number.isInteger(renderingIntent) && renderingIntent > 0,\n '_pumpOperatorList: Expected valid \"renderingIntent\" argument.'\n );\n }\n const { map, transfer } = annotationStorageSerializable;\n\n const readableStream = this._transport.messageHandler.sendWithStream(\n \"GetOperatorList\",\n {\n pageIndex: this._pageIndex,\n intent: renderingIntent,\n cacheKey,\n annotationStorage: map,\n modifiedIds,\n },\n transfer\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 (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\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 {StatTimer | null} Returns page stats, if enabled; returns `null`\n * otherwise.\n */\n get stats() {\n return this._stats;\n }\n}\n\n/**\n * @typedef {Object} PDFWorkerParameters\n * @property {string} [name] - The name of the worker.\n * @property {Worker} [port] - The `workerPort` object.\n * @property {number} [verbosity] - Controls the logging level;\n * the constants from {@link VerbosityLevel} should be used.\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 #capability = Promise.withResolvers();\n\n #messageHandler = null;\n\n #port = null;\n\n #webWorker = null;\n\n static #fakeWorkerId = 0;\n\n static #isWorkerDisabled = false;\n\n static #workerPorts = new WeakMap();\n\n static {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n if (isNodeJS) {\n // Workers aren't supported in Node.js, force-disabling them there.\n this.#isWorkerDisabled = true;\n\n GlobalWorkerOptions.workerSrc ||= PDFJSDev.test(\"LIB\")\n ? \"../pdf.worker.js\"\n : \"./pdf.worker.mjs\";\n }\n\n // Check if URLs have the same origin. For non-HTTP based URLs, returns\n // false.\n this._isSameOrigin = (baseUrl, otherUrl) => {\n const base = URL.parse(baseUrl);\n if (!base?.origin || base.origin === \"null\") {\n return false; // non-HTTP url\n }\n const other = new URL(otherUrl, base);\n return base.origin === other.origin;\n };\n\n this._createCDNWrapper = 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\n // not exist or fail for some reason -- our Worker creation will fail\n // anyway.\n const wrapper = `await import(\"${url}\");`;\n return URL.createObjectURL(\n new Blob([wrapper], { type: \"text/javascript\" })\n );\n };\n\n this.fromPort = params => {\n deprecated(\n \"`PDFWorker.fromPort` - please use `PDFWorker.create` instead.\"\n );\n if (!params?.port) {\n throw new Error(\"PDFWorker.fromPort - invalid method signature.\");\n }\n return this.create(params);\n };\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n this._resetGlobalState = () => {\n this.#isWorkerDisabled = false;\n delete globalThis.pdfjsWorker;\n };\n }\n }\n\n constructor({\n name = null,\n port = null,\n verbosity = getVerbosityLevel(),\n } = {}) {\n this.name = name;\n this.destroyed = false;\n this.verbosity = verbosity;\n\n if (port) {\n if (PDFWorker.#workerPorts.has(port)) {\n throw new Error(\"Cannot use more than one PDFWorker per port.\");\n }\n PDFWorker.#workerPorts.set(port, this);\n this.#initializeFromPort(port);\n } else {\n this.#initialize();\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // For testing purposes.\n Object.defineProperty(this, \"_webWorker\", {\n get() {\n return this.#webWorker;\n },\n });\n }\n }\n\n /**\n * Promise for worker initialization completion.\n * @type {Promise}\n */\n get promise() {\n return this.#capability.promise;\n }\n\n #resolve() {\n this.#capability.resolve();\n // Send global setting, e.g. verbosity level.\n this.#messageHandler.send(\"configure\", {\n verbosity: this.verbosity,\n });\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\", () => {\n // Ignoring \"ready\" event -- MessageHandler should already be initialized\n // and ready to accept messages.\n });\n this.#resolve();\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.\n if (\n PDFWorker.#isWorkerDisabled ||\n PDFWorker.#mainThreadWorkerMessageHandler\n ) {\n this.#setupFakeWorker();\n return;\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 !PDFWorker._isSameOrigin(window.location, workerSrc)\n ) {\n workerSrc = PDFWorker._createCDNWrapper(\n new URL(workerSrc, window.location).href\n );\n }\n\n const worker = new Worker(workerSrc, { type: \"module\" });\n const messageHandler = new MessageHandler(\"main\", \"worker\", worker);\n const terminateEarly = () => {\n ac.abort();\n messageHandler.destroy();\n worker.terminate();\n if (this.destroyed) {\n this.#capability.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 ac = new AbortController();\n worker.addEventListener(\n \"error\",\n () => {\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 { signal: ac.signal }\n );\n\n messageHandler.on(\"test\", data => {\n ac.abort();\n if (this.destroyed || !data) {\n terminateEarly();\n return;\n }\n this.#messageHandler = messageHandler;\n this.#port = worker;\n this.#webWorker = worker;\n\n this.#resolve();\n });\n\n messageHandler.on(\"ready\", data => {\n ac.abort();\n if (this.destroyed) {\n terminateEarly();\n return;\n }\n try {\n sendTest();\n } catch {\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 {\n info(\"The worker has been disabled.\");\n }\n // Either workers are not supported or have thrown an exception.\n // Thus, we fallback to a faked worker.\n this.#setupFakeWorker();\n }\n\n #setupFakeWorker() {\n if (!PDFWorker.#isWorkerDisabled) {\n warn(\"Setting up fake worker.\");\n PDFWorker.#isWorkerDisabled = true;\n }\n\n PDFWorker._setupFakeWorkerGlobal\n .then(WorkerMessageHandler => {\n if (this.destroyed) {\n this.#capability.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${PDFWorker.#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 this.#messageHandler = new MessageHandler(id, id + \"_worker\", port);\n this.#resolve();\n })\n .catch(reason => {\n this.#capability.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\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\n this.#messageHandler?.destroy();\n this.#messageHandler = null;\n }\n\n /**\n * @param {PDFWorkerParameters} params - The worker initialization parameters.\n * @returns {PDFWorker}\n */\n static create(params) {\n const cachedPort = this.#workerPorts.get(params?.port);\n if (cachedPort) {\n if (cachedPort._pendingDestroy) {\n throw new Error(\n \"PDFWorker.create - the worker is being destroyed.\\n\" +\n \"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls.\"\n );\n }\n return cachedPort;\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 throw new Error('No \"GlobalWorkerOptions.workerSrc\" specified.');\n }\n\n static get #mainThreadWorkerMessageHandler() {\n try {\n return globalThis.pdfjsWorker?.WorkerMessageHandler || null;\n } catch {\n return null;\n }\n }\n\n // Loads worker code into the main-thread.\n static get _setupFakeWorkerGlobal() {\n const loader = async () => {\n if (this.#mainThreadWorkerMessageHandler) {\n // The worker was already loaded using e.g. a ` + + + + + + + +
+ + +
+
+
+
+ + + + +
+
+ +
+
+
+ + +
+
+
+
+
+
+ + + +
+
+
+ +
+
+
+
+
+ +
+
+ + +
+
+ +
+ +
+
+ + + + +
+
+
+
+ +
+ +
+ + + +
+
+
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ +
+ + + +
+ +
+ +
+ + +
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ + +
+
+ +
+ +

-

+
+
+ +

-

+
+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+ +

-

+
+
+
+ +

-

+
+
+ +
+
+ +
+
+ + +
+
+
+
+ + +
+
+ +
+
+
+ +
+
+
+
+
+ + +
+
+ +
+
+
+
+ + +
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+ +
+
+
+ + +
+ +
+
+
+
+
+
+ + +
+ +
+
+
+ + + +
+
+
+ + +
+
+ +
+
+ +
+
+
+ + +
+
+ +
+
+
+
+ +
+ +
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+ +
+
+
+
+ +
+
+
+ + + +
+
+ +
+
+ + + +
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+ +
+ + + +
+
+
+
+
+ + + + + +
+ +
+
+ + + + +
+
+ +
+ + +
+
+
+
+ + +
+
+ +
+
+
+ + + + + +
+ +
+
+ + +
+
+
+ + +
+
+ +
+ +
+ + +
+
+
+ + +
+ +
+
+ + 0% +
+
+ +
+
+
+ + + +
+
+ + diff --git a/frontend/static/pdfjs/web/viewer.mjs b/frontend/static/pdfjs/web/viewer.mjs new file mode 100644 index 0000000..94d7c77 --- /dev/null +++ b/frontend/static/pdfjs/web/viewer.mjs @@ -0,0 +1,18337 @@ +/** + * @licstart The following is the entire license notice for the + * JavaScript code in this page + * + * Copyright 2024 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @licend The above is the entire license notice for the + * JavaScript code in this page + */ + +/** + * pdfjsVersion = 5.4.296 + * pdfjsBuild = f56dc8601 + */ +/******/ // The require scope +/******/ var __webpack_require__ = {}; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; + +;// ./web/pdfjs.js +const { + AbortException, + AnnotationEditorLayer, + AnnotationEditorParamsType, + AnnotationEditorType, + AnnotationEditorUIManager, + AnnotationLayer, + AnnotationMode, + AnnotationType, + applyOpacity, + build, + ColorPicker, + createValidAbsoluteUrl, + CSSConstants, + DOMSVGFactory, + DrawLayer, + FeatureTest, + fetchData, + findContrastColor, + getDocument, + getFilenameFromUrl, + getPdfFilenameFromUrl: pdfjs_getPdfFilenameFromUrl, + getRGB, + getUuid, + getXfaPageViewport, + GlobalWorkerOptions, + ImageKind, + InvalidPDFException, + isDataScheme, + isPdfFile, + isValidExplicitDest, + MathClamp, + noContextMenu, + normalizeUnicode, + OPS, + OutputScale, + PasswordResponses, + PDFDataRangeTransport, + PDFDateString, + PDFWorker, + PermissionFlag, + PixelsPerInch, + RenderingCancelledException, + renderRichText, + ResponseException, + setLayerDimensions, + shadow, + SignatureExtractor, + stopEvent, + SupportedImageMimeTypes, + TextLayer, + TouchManager, + updateUrlHash, + Util, + VerbosityLevel, + version, + XfaLayer +} = globalThis.pdfjsLib; + +;// ./web/ui_utils.js + +const DEFAULT_SCALE_VALUE = "auto"; +const DEFAULT_SCALE = 1.0; +const DEFAULT_SCALE_DELTA = 1.1; +const MIN_SCALE = 0.1; +const MAX_SCALE = 10.0; +const UNKNOWN_SCALE = 0; +const MAX_AUTO_SCALE = 1.25; +const SCROLLBAR_PADDING = 40; +const VERTICAL_PADDING = 5; +const RenderingStates = { + INITIAL: 0, + RUNNING: 1, + PAUSED: 2, + FINISHED: 3 +}; +const PresentationModeState = { + UNKNOWN: 0, + NORMAL: 1, + CHANGING: 2, + FULLSCREEN: 3 +}; +const SidebarView = { + UNKNOWN: -1, + NONE: 0, + THUMBS: 1, + OUTLINE: 2, + ATTACHMENTS: 3, + LAYERS: 4 +}; +const TextLayerMode = { + DISABLE: 0, + ENABLE: 1, + ENABLE_PERMISSIONS: 2 +}; +const ScrollMode = { + UNKNOWN: -1, + VERTICAL: 0, + HORIZONTAL: 1, + WRAPPED: 2, + PAGE: 3 +}; +const SpreadMode = { + UNKNOWN: -1, + NONE: 0, + ODD: 1, + EVEN: 2 +}; +const CursorTool = { + SELECT: 0, + HAND: 1, + ZOOM: 2 +}; +const AutoPrintRegExp = /\bprint\s*\(/; +function scrollIntoView(element, spot, scrollMatches = false) { + let parent = element.offsetParent; + if (!parent) { + console.error("offsetParent is not set -- cannot scroll"); + return; + } + let offsetY = element.offsetTop + element.clientTop; + let offsetX = element.offsetLeft + element.clientLeft; + while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || scrollMatches && (parent.classList.contains("markedContent") || getComputedStyle(parent).overflow === "hidden")) { + offsetY += parent.offsetTop; + offsetX += parent.offsetLeft; + parent = parent.offsetParent; + if (!parent) { + return; + } + } + if (spot) { + if (spot.top !== undefined) { + offsetY += spot.top; + } + if (spot.left !== undefined) { + if (scrollMatches) { + const elementWidth = element.getBoundingClientRect().width; + const padding = MathClamp((parent.clientWidth - elementWidth) / 2, 20, 400); + offsetX += spot.left - padding; + } else { + offsetX += spot.left; + } + parent.scrollLeft = offsetX; + } + } + parent.scrollTop = offsetY; +} +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { + const debounceScroll = function (evt) { + if (rAF) { + return; + } + rAF = window.requestAnimationFrame(function viewAreaElementScrolled() { + rAF = null; + const currentX = viewAreaElement.scrollLeft; + const lastX = state.lastX; + if (currentX !== lastX) { + state.right = currentX > lastX; + } + state.lastX = currentX; + const currentY = viewAreaElement.scrollTop; + const lastY = state.lastY; + if (currentY !== lastY) { + state.down = currentY > lastY; + } + state.lastY = currentY; + callback(state); + }); + }; + const state = { + right: true, + down: true, + lastX: viewAreaElement.scrollLeft, + lastY: viewAreaElement.scrollTop, + _eventHandler: debounceScroll + }; + let rAF = null; + viewAreaElement.addEventListener("scroll", debounceScroll, { + useCapture: true, + signal: abortSignal + }); + abortSignal?.addEventListener("abort", () => window.cancelAnimationFrame(rAF), { + once: true + }); + return state; +} +function parseQueryString(query) { + const params = new Map(); + for (const [key, value] of new URLSearchParams(query)) { + params.set(key.toLowerCase(), value); + } + return params; +} +const InvisibleCharsRegExp = /[\x00-\x1F]/g; +function removeNullCharacters(str, replaceInvisible = false) { + if (!InvisibleCharsRegExp.test(str)) { + return str; + } + if (replaceInvisible) { + return str.replaceAll(InvisibleCharsRegExp, m => m === "\x00" ? "" : " "); + } + return str.replaceAll("\x00", ""); +} +function binarySearchFirstItem(items, condition, start = 0) { + let minIndex = start; + let maxIndex = items.length - 1; + if (maxIndex < 0 || !condition(items[maxIndex])) { + return items.length; + } + if (condition(items[minIndex])) { + return minIndex; + } + while (minIndex < maxIndex) { + const currentIndex = minIndex + maxIndex >> 1; + const currentItem = items[currentIndex]; + if (condition(currentItem)) { + maxIndex = currentIndex; + } else { + minIndex = currentIndex + 1; + } + } + return minIndex; +} +function approximateFraction(x) { + if (Math.floor(x) === x) { + return [x, 1]; + } + const xinv = 1 / x; + const limit = 8; + if (xinv > limit) { + return [1, limit]; + } else if (Math.floor(xinv) === xinv) { + return [1, xinv]; + } + const x_ = x > 1 ? xinv : x; + let a = 0, + b = 1, + c = 1, + d = 1; + while (true) { + const p = a + c, + q = b + d; + if (q > limit) { + break; + } + if (x_ <= p / q) { + c = p; + d = q; + } else { + a = p; + b = q; + } + } + let result; + if (x_ - a / b < c / d - x_) { + result = x_ === x ? [a, b] : [b, a]; + } else { + result = x_ === x ? [c, d] : [d, c]; + } + return result; +} +function floorToDivide(x, div) { + return x - x % div; +} +function getPageSizeInches({ + view, + userUnit, + rotate +}) { + const [x1, y1, x2, y2] = view; + const changeOrientation = rotate % 180 !== 0; + const width = (x2 - x1) / 72 * userUnit; + const height = (y2 - y1) / 72 * userUnit; + return { + width: changeOrientation ? height : width, + height: changeOrientation ? width : height + }; +} +function backtrackBeforeAllVisibleElements(index, views, top) { + if (index < 2) { + return index; + } + let elt = views[index].div; + let pageTop = elt.offsetTop + elt.clientTop; + if (pageTop >= top) { + elt = views[index - 1].div; + pageTop = elt.offsetTop + elt.clientTop; + } + for (let i = index - 2; i >= 0; --i) { + elt = views[i].div; + if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) { + break; + } + index = i; + } + return index; +} +function getVisibleElements({ + scrollEl, + views, + sortByVisibility = false, + horizontal = false, + rtl = false +}) { + const top = scrollEl.scrollTop, + bottom = top + scrollEl.clientHeight; + const left = scrollEl.scrollLeft, + right = left + scrollEl.clientWidth; + function isElementBottomAfterViewTop(view) { + const element = view.div; + const elementBottom = element.offsetTop + element.clientTop + element.clientHeight; + return elementBottom > top; + } + function isElementNextAfterViewHorizontally(view) { + const element = view.div; + const elementLeft = element.offsetLeft + element.clientLeft; + const elementRight = elementLeft + element.clientWidth; + return rtl ? elementLeft < right : elementRight > left; + } + const visible = [], + ids = new Set(), + numViews = views.length; + let firstVisibleElementInd = binarySearchFirstItem(views, horizontal ? isElementNextAfterViewHorizontally : isElementBottomAfterViewTop); + if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) { + firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top); + } + let lastEdge = horizontal ? right : -1; + for (let i = firstVisibleElementInd; i < numViews; i++) { + const view = views[i], + element = view.div; + const currentWidth = element.offsetLeft + element.clientLeft; + const currentHeight = element.offsetTop + element.clientTop; + const viewWidth = element.clientWidth, + viewHeight = element.clientHeight; + const viewRight = currentWidth + viewWidth; + const viewBottom = currentHeight + viewHeight; + if (lastEdge === -1) { + if (viewBottom >= bottom) { + lastEdge = viewBottom; + } + } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) { + break; + } + if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) { + continue; + } + const minY = Math.max(0, top - currentHeight); + const minX = Math.max(0, left - currentWidth); + const hiddenHeight = minY + Math.max(0, viewBottom - bottom); + const hiddenWidth = minX + Math.max(0, viewRight - right); + const fractionHeight = (viewHeight - hiddenHeight) / viewHeight, + fractionWidth = (viewWidth - hiddenWidth) / viewWidth; + const percent = fractionHeight * fractionWidth * 100 | 0; + visible.push({ + id: view.id, + x: currentWidth, + y: currentHeight, + visibleArea: percent === 100 ? null : { + minX, + minY, + maxX: Math.min(viewRight, right) - currentWidth, + maxY: Math.min(viewBottom, bottom) - currentHeight + }, + view, + percent, + widthPercent: fractionWidth * 100 | 0 + }); + ids.add(view.id); + } + const first = visible[0], + last = visible.at(-1); + if (sortByVisibility) { + visible.sort(function (a, b) { + const pc = a.percent - b.percent; + if (Math.abs(pc) > 0.001) { + return -pc; + } + return a.id - b.id; + }); + } + return { + first, + last, + views: visible, + ids + }; +} +function normalizeWheelEventDirection(evt) { + let delta = Math.hypot(evt.deltaX, evt.deltaY); + const angle = Math.atan2(evt.deltaY, evt.deltaX); + if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) { + delta = -delta; + } + return delta; +} +function normalizeWheelEventDelta(evt) { + const deltaMode = evt.deltaMode; + let delta = normalizeWheelEventDirection(evt); + const MOUSE_PIXELS_PER_LINE = 30; + const MOUSE_LINES_PER_PAGE = 30; + if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) { + delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE; + } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) { + delta /= MOUSE_LINES_PER_PAGE; + } + return delta; +} +function isValidRotation(angle) { + return Number.isInteger(angle) && angle % 90 === 0; +} +function isValidScrollMode(mode) { + return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN; +} +function isValidSpreadMode(mode) { + return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN; +} +function isPortraitOrientation(size) { + return size.width <= size.height; +} +const animationStarted = new Promise(function (resolve) { + window.requestAnimationFrame(resolve); +}); +const docStyle = document.documentElement.style; +class ProgressBar { + #classList = null; + #disableAutoFetchTimeout = null; + #percent = 0; + #style = null; + #visible = true; + constructor(bar) { + this.#classList = bar.classList; + this.#style = bar.style; + } + get percent() { + return this.#percent; + } + set percent(val) { + this.#percent = MathClamp(val, 0, 100); + if (isNaN(val)) { + this.#classList.add("indeterminate"); + return; + } + this.#classList.remove("indeterminate"); + this.#style.setProperty("--progressBar-percent", `${this.#percent}%`); + } + setWidth(viewer) { + if (!viewer) { + return; + } + const container = viewer.parentNode; + const scrollbarWidth = container.offsetWidth - viewer.offsetWidth; + if (scrollbarWidth > 0) { + this.#style.setProperty("--progressBar-end-offset", `${scrollbarWidth}px`); + } + } + setDisableAutoFetch(delay = 5000) { + if (this.#percent === 100 || isNaN(this.#percent)) { + return; + } + if (this.#disableAutoFetchTimeout) { + clearTimeout(this.#disableAutoFetchTimeout); + } + this.show(); + this.#disableAutoFetchTimeout = setTimeout(() => { + this.#disableAutoFetchTimeout = null; + this.hide(); + }, delay); + } + hide() { + if (!this.#visible) { + return; + } + this.#visible = false; + this.#classList.add("hidden"); + } + show() { + if (this.#visible) { + return; + } + this.#visible = true; + this.#classList.remove("hidden"); + } +} +function getActiveOrFocusedElement() { + let curRoot = document; + let curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + while (curActiveOrFocused?.shadowRoot) { + curRoot = curActiveOrFocused.shadowRoot; + curActiveOrFocused = curRoot.activeElement || curRoot.querySelector(":focus"); + } + return curActiveOrFocused; +} +function apiPageLayoutToViewerModes(layout) { + let scrollMode = ScrollMode.VERTICAL, + spreadMode = SpreadMode.NONE; + switch (layout) { + case "SinglePage": + scrollMode = ScrollMode.PAGE; + break; + case "OneColumn": + break; + case "TwoPageLeft": + scrollMode = ScrollMode.PAGE; + case "TwoColumnLeft": + spreadMode = SpreadMode.ODD; + break; + case "TwoPageRight": + scrollMode = ScrollMode.PAGE; + case "TwoColumnRight": + spreadMode = SpreadMode.EVEN; + break; + } + return { + scrollMode, + spreadMode + }; +} +function apiPageModeToSidebarView(mode) { + switch (mode) { + case "UseNone": + return SidebarView.NONE; + case "UseThumbs": + return SidebarView.THUMBS; + case "UseOutlines": + return SidebarView.OUTLINE; + case "UseAttachments": + return SidebarView.ATTACHMENTS; + case "UseOC": + return SidebarView.LAYERS; + } + return SidebarView.NONE; +} +function toggleCheckedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-checked", toggle); + view?.classList.toggle("hidden", !toggle); +} +function toggleExpandedBtn(button, toggle, view = null) { + button.classList.toggle("toggled", toggle); + button.setAttribute("aria-expanded", toggle); + view?.classList.toggle("hidden", !toggle); +} +const calcRound = function () { + const e = document.createElement("div"); + e.style.width = "round(down, calc(1.6666666666666665 * 792px), 1px)"; + return e.style.width === "calc(1320px)" ? Math.fround : x => x; +}(); + +;// ./web/app_options.js +{ + var compatParams = new Map(); + const { + maxTouchPoints, + platform, + userAgent + } = navigator; + const isAndroid = /Android/.test(userAgent); + const isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) || platform === "MacIntel" && maxTouchPoints > 1; + (function () { + if (isIOS || isAndroid) { + compatParams.set("maxCanvasPixels", 5242880); + } + })(); + (function () { + if (isAndroid) { + compatParams.set("useSystemFonts", false); + } + })(); +} +const OptionKind = { + BROWSER: 0x01, + VIEWER: 0x02, + API: 0x04, + WORKER: 0x08, + EVENT_DISPATCH: 0x10, + PREFERENCE: 0x80 +}; +const Type = { + BOOLEAN: 0x01, + NUMBER: 0x02, + OBJECT: 0x04, + STRING: 0x08, + UNDEFINED: 0x10 +}; +const defaultOptions = { + allowedGlobalEvents: { + value: null, + kind: OptionKind.BROWSER + }, + canvasMaxAreaInBytes: { + value: -1, + kind: OptionKind.BROWSER + OptionKind.API + }, + isInAutomation: { + value: false, + kind: OptionKind.BROWSER + }, + localeProperties: { + value: { + lang: navigator.language || "en-US" + }, + kind: OptionKind.BROWSER + }, + maxCanvasDim: { + value: 32767, + kind: OptionKind.BROWSER + OptionKind.VIEWER + }, + nimbusDataStr: { + value: "", + kind: OptionKind.BROWSER + }, + supportsCaretBrowsingMode: { + value: false, + kind: OptionKind.BROWSER + }, + supportsDocumentFonts: { + value: true, + kind: OptionKind.BROWSER + }, + supportsIntegratedFind: { + value: false, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomCtrlKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsMouseWheelZoomMetaKey: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPinchToZoom: { + value: true, + kind: OptionKind.BROWSER + }, + supportsPrinting: { + value: true, + kind: OptionKind.BROWSER + }, + toolbarDensity: { + value: 0, + kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH + }, + altTextLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationEditorMode: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + annotationMode: { + value: 2, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + capCanvasAreaFactor: { + value: 200, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + commentLearnMoreUrl: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cursorToolOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + debuggerSrc: { + value: "./debugger.mjs", + kind: OptionKind.VIEWER + }, + defaultZoomDelay: { + value: 400, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + defaultZoomValue: { + value: "", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + disableHistory: { + value: false, + kind: OptionKind.VIEWER + }, + disablePageLabels: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltText: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableAltTextModelDownload: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableAutoLinking: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableComment: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableDetailCanvas: { + value: true, + kind: OptionKind.VIEWER + }, + enableGuessAltText: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH + }, + enableHighlightFloatingButton: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableNewAltTextWhenAddingImage: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableOptimizedPartialRendering: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePermissions: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enablePrintAutoRotate: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableScripting: { + value: true, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableSignatureEditor: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableUpdatedAddImage: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + externalLinkRel: { + value: "noopener noreferrer nofollow", + kind: OptionKind.VIEWER + }, + externalLinkTarget: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + highlightEditorColors: { + value: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F," + "yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + historyUpdateUrl: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + ignoreDestinationZoom: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + imageResourcesPath: { + value: "./images/", + kind: OptionKind.VIEWER + }, + maxCanvasPixels: { + value: 2 ** 25, + kind: OptionKind.VIEWER + }, + minDurationToUpdateCanvas: { + value: 500, + kind: OptionKind.VIEWER + }, + forcePageColors: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsBackground: { + value: "Canvas", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pageColorsForeground: { + value: "CanvasText", + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + pdfBugEnabled: { + value: false, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + printResolution: { + value: 150, + kind: OptionKind.VIEWER + }, + sidebarViewOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + scrollModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + spreadModeOnLoad: { + value: -1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + textLayerMode: { + value: 1, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewerCssTheme: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + viewOnLoad: { + value: 0, + kind: OptionKind.VIEWER + OptionKind.PREFERENCE + }, + cMapPacked: { + value: true, + kind: OptionKind.API + }, + cMapUrl: { + value: "../web/cmaps/", + kind: OptionKind.API + }, + disableAutoFetch: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableFontFace: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableRange: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + disableStream: { + value: false, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + docBaseUrl: { + value: "", + kind: OptionKind.API + }, + enableHWA: { + value: true, + kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE + }, + enableXfa: { + value: true, + kind: OptionKind.API + OptionKind.PREFERENCE + }, + fontExtraProperties: { + value: false, + kind: OptionKind.API + }, + iccUrl: { + value: "../web/iccs/", + kind: OptionKind.API + }, + isEvalSupported: { + value: true, + kind: OptionKind.API + }, + isOffscreenCanvasSupported: { + value: true, + kind: OptionKind.API + }, + maxImageSize: { + value: -1, + kind: OptionKind.API + }, + pdfBug: { + value: false, + kind: OptionKind.API + }, + standardFontDataUrl: { + value: "../web/standard_fonts/", + kind: OptionKind.API + }, + useSystemFonts: { + value: undefined, + kind: OptionKind.API, + type: Type.BOOLEAN + Type.UNDEFINED + }, + verbosity: { + value: 1, + kind: OptionKind.API + }, + wasmUrl: { + value: "../web/wasm/", + kind: OptionKind.API + }, + workerPort: { + value: null, + kind: OptionKind.WORKER + }, + workerSrc: { + value: "../build/pdf.worker.mjs", + kind: OptionKind.WORKER + } +}; +{ + defaultOptions.defaultUrl = { + value: "compressed.tracemonkey-pldi-09.pdf", + kind: OptionKind.VIEWER + }; + defaultOptions.sandboxBundleSrc = { + value: "../build/pdf.sandbox.mjs", + kind: OptionKind.VIEWER + }; + defaultOptions.enableFakeMLManager = { + value: true, + kind: OptionKind.VIEWER + }; +} +{ + defaultOptions.disablePreferences = { + value: false, + kind: OptionKind.VIEWER + }; +} +class AppOptions { + static eventBus; + static #opts = new Map(); + static { + for (const name in defaultOptions) { + this.#opts.set(name, defaultOptions[name].value); + } + for (const [name, value] of compatParams) { + this.#opts.set(name, value); + } + this._hasInvokedSet = false; + this._checkDisablePreferences = () => { + if (this.get("disablePreferences")) { + return true; + } + if (this._hasInvokedSet) { + console.warn("The Preferences may override manually set AppOptions; " + 'please use the "disablePreferences"-option to prevent that.'); + } + return false; + }; + } + static get(name) { + return this.#opts.get(name); + } + static getAll(kind = null, defaultOnly = false) { + const options = Object.create(null); + for (const name in defaultOptions) { + const defaultOpt = defaultOptions[name]; + if (kind && !(kind & defaultOpt.kind)) { + continue; + } + options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value; + } + return options; + } + static set(name, value) { + this.setAll({ + [name]: value + }); + } + static setAll(options, prefs = false) { + this._hasInvokedSet ||= true; + let events; + for (const name in options) { + const defaultOpt = defaultOptions[name], + userOpt = options[name]; + if (!defaultOpt || !(typeof userOpt === typeof defaultOpt.value || Type[(typeof userOpt).toUpperCase()] & defaultOpt.type)) { + continue; + } + const { + kind + } = defaultOpt; + if (prefs && !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)) { + continue; + } + if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) { + (events ||= new Map()).set(name, userOpt); + } + this.#opts.set(name, userOpt); + } + if (events) { + for (const [name, value] of events) { + this.eventBus.dispatch(name.toLowerCase(), { + source: this, + value + }); + } + } + } +} + +;// ./web/pdf_link_service.js + + +const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; +const LinkTarget = { + NONE: 0, + SELF: 1, + BLANK: 2, + PARENT: 3, + TOP: 4 +}; +class PDFLinkService { + externalLinkEnabled = true; + constructor({ + eventBus, + externalLinkTarget = null, + externalLinkRel = null, + ignoreDestinationZoom = false + } = {}) { + this.eventBus = eventBus; + this.externalLinkTarget = externalLinkTarget; + this.externalLinkRel = externalLinkRel; + this._ignoreDestinationZoom = ignoreDestinationZoom; + this.baseUrl = null; + this.pdfDocument = null; + this.pdfViewer = null; + this.pdfHistory = null; + } + setDocument(pdfDocument, baseUrl = null) { + this.baseUrl = baseUrl; + this.pdfDocument = pdfDocument; + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setHistory(pdfHistory) { + this.pdfHistory = pdfHistory; + } + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + } + get page() { + return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1; + } + set page(value) { + if (this.pdfDocument) { + this.pdfViewer.currentPageNumber = value; + } + } + get rotation() { + return this.pdfDocument ? this.pdfViewer.pagesRotation : 0; + } + set rotation(value) { + if (this.pdfDocument) { + this.pdfViewer.pagesRotation = value; + } + } + get isInPresentationMode() { + return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false; + } + async goToDestination(dest) { + if (!this.pdfDocument) { + return; + } + let namedDest, explicitDest, pageNumber; + if (typeof dest === "string") { + namedDest = dest; + explicitDest = await this.pdfDocument.getDestination(dest); + } else { + namedDest = null; + explicitDest = await dest; + } + if (!Array.isArray(explicitDest)) { + console.error(`goToDestination: "${explicitDest}" is not a valid destination array, for dest="${dest}".`); + return; + } + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = this.pdfDocument.cachedPageNumber(destRef); + if (!pageNumber) { + try { + pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + } catch { + console.error(`goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".`); + return; + } + } + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + console.error(`goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.push({ + namedDest, + explicitDest, + pageNumber + }); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: explicitDest, + ignoreDestinationZoom: this._ignoreDestinationZoom + }); + const ac = new AbortController(); + this.eventBus._on("textlayerrendered", evt => { + if (evt.pageNumber === pageNumber) { + evt.source.textLayer.div.focus(); + ac.abort(); + } + }, { + signal: ac.signal + }); + } + goToPage(val) { + if (!this.pdfDocument) { + return; + } + const pageNumber = typeof val === "string" && this.pdfViewer.pageLabelToPageNumber(val) || val | 0; + if (!(Number.isInteger(pageNumber) && pageNumber > 0 && pageNumber <= this.pagesCount)) { + console.error(`PDFLinkService.goToPage: "${val}" is not a valid page.`); + return; + } + if (this.pdfHistory) { + this.pdfHistory.pushCurrentPosition(); + this.pdfHistory.pushPage(pageNumber); + } + this.pdfViewer.scrollPageIntoView({ + pageNumber + }); + } + goToXY(pageNumber, x, y, options = {}) { + this.pdfViewer.scrollPageIntoView({ + pageNumber, + destArray: [null, { + name: "XYZ" + }, x, y], + ignoreDestinationZoom: true, + ...options + }); + } + addLinkAttributes(link, url, newWindow = false) { + if (!url || typeof url !== "string") { + throw new Error('A valid "url" parameter must provided.'); + } + const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget, + rel = this.externalLinkRel; + if (this.externalLinkEnabled) { + link.href = link.title = url; + } else { + link.href = ""; + link.title = `Disabled: ${url}`; + link.onclick = () => false; + } + let targetStr = ""; + switch (target) { + case LinkTarget.NONE: + break; + case LinkTarget.SELF: + targetStr = "_self"; + break; + case LinkTarget.BLANK: + targetStr = "_blank"; + break; + case LinkTarget.PARENT: + targetStr = "_parent"; + break; + case LinkTarget.TOP: + targetStr = "_top"; + break; + } + link.target = targetStr; + link.rel = typeof rel === "string" ? rel : DEFAULT_LINK_REL; + } + getDestinationHash(dest) { + if (typeof dest === "string") { + if (dest.length > 0) { + return this.getAnchorUrl("#" + escape(dest)); + } + } else if (Array.isArray(dest)) { + const str = JSON.stringify(dest); + if (str.length > 0) { + return this.getAnchorUrl("#" + escape(str)); + } + } + return this.getAnchorUrl(""); + } + getAnchorUrl(anchor) { + return this.baseUrl ? this.baseUrl + anchor : anchor; + } + setHash(hash) { + if (!this.pdfDocument) { + return; + } + let pageNumber, dest; + if (hash.includes("=")) { + const params = parseQueryString(hash); + if (params.has("search")) { + const query = params.get("search").replaceAll('"', ""), + phrase = params.get("phrase") === "true"; + this.eventBus.dispatch("findfromurlhash", { + source: this, + query: phrase ? query : query.match(/\S+/g) + }); + } + if (params.has("page")) { + pageNumber = params.get("page") | 0 || 1; + } + if (params.has("zoom")) { + const zoomArgs = params.get("zoom").split(","); + const zoomArg = zoomArgs[0]; + const zoomArgNumber = parseFloat(zoomArg); + if (!zoomArg.includes("Fit")) { + dest = [null, { + name: "XYZ" + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; + } else if (zoomArg === "Fit" || zoomArg === "FitB") { + dest = [null, { + name: zoomArg + }]; + } else if (zoomArg === "FitH" || zoomArg === "FitBH" || zoomArg === "FitV" || zoomArg === "FitBV") { + dest = [null, { + name: zoomArg + }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; + } else if (zoomArg === "FitR") { + if (zoomArgs.length !== 5) { + console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); + } else { + dest = [null, { + name: zoomArg + }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; + } + } else { + console.error(`PDFLinkService.setHash: "${zoomArg}" is not a valid zoom value.`); + } + } + if (dest) { + this.pdfViewer.scrollPageIntoView({ + pageNumber: pageNumber || this.page, + destArray: dest, + allowNegativeOffset: true + }); + } else if (pageNumber) { + this.page = pageNumber; + } + if (params.has("pagemode")) { + this.eventBus.dispatch("pagemode", { + source: this, + mode: params.get("pagemode") + }); + } + if (params.has("nameddest")) { + this.goToDestination(params.get("nameddest")); + } + return; + } + dest = unescape(hash); + try { + dest = JSON.parse(dest); + if (!Array.isArray(dest)) { + dest = dest.toString(); + } + } catch {} + if (typeof dest === "string" || isValidExplicitDest(dest)) { + this.goToDestination(dest); + return; + } + console.error(`PDFLinkService.setHash: "${unescape(hash)}" is not a valid destination.`); + } + executeNamedAction(action) { + if (!this.pdfDocument) { + return; + } + switch (action) { + case "GoBack": + this.pdfHistory?.back(); + break; + case "GoForward": + this.pdfHistory?.forward(); + break; + case "NextPage": + this.pdfViewer.nextPage(); + break; + case "PrevPage": + this.pdfViewer.previousPage(); + break; + case "LastPage": + this.page = this.pagesCount; + break; + case "FirstPage": + this.page = 1; + break; + default: + break; + } + this.eventBus.dispatch("namedaction", { + source: this, + action + }); + } + async executeSetOCGState(action) { + if (!this.pdfDocument) { + return; + } + const pdfDocument = this.pdfDocument, + optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise; + if (pdfDocument !== this.pdfDocument) { + return; + } + optionalContentConfig.setOCGState(action); + this.pdfViewer.optionalContentConfigPromise = Promise.resolve(optionalContentConfig); + } +} +class SimpleLinkService extends PDFLinkService { + setDocument(pdfDocument, baseUrl = null) {} +} + +;// ./web/event_utils.js +const WaitOnType = { + EVENT: "event", + TIMEOUT: "timeout" +}; +async function waitOnEventOrTimeout({ + target, + name, + delay = 0 +}) { + if (typeof target !== "object" || !(name && typeof name === "string") || !(Number.isInteger(delay) && delay >= 0)) { + throw new Error("waitOnEventOrTimeout - invalid parameters."); + } + const { + promise, + resolve + } = Promise.withResolvers(); + const ac = new AbortController(); + function handler(type) { + ac.abort(); + clearTimeout(timeout); + resolve(type); + } + const evtMethod = target instanceof EventBus ? "_on" : "addEventListener"; + target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), { + signal: ac.signal + }); + const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay); + return promise; +} +class EventBus { + #listeners = Object.create(null); + on(eventName, listener, options = null) { + this._on(eventName, listener, { + external: true, + once: options?.once, + signal: options?.signal + }); + } + off(eventName, listener, options = null) { + this._off(eventName, listener); + } + dispatch(eventName, data) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners || eventListeners.length === 0) { + return; + } + let externalListeners; + for (const { + listener, + external, + once + } of eventListeners.slice(0)) { + if (once) { + this._off(eventName, listener); + } + if (external) { + (externalListeners ||= []).push(listener); + continue; + } + listener(data); + } + if (externalListeners) { + for (const listener of externalListeners) { + listener(data); + } + externalListeners = null; + } + } + _on(eventName, listener, options = null) { + let rmAbort = null; + if (options?.signal instanceof AbortSignal) { + const { + signal + } = options; + if (signal.aborted) { + console.error("Cannot use an `aborted` signal."); + return; + } + const onAbort = () => this._off(eventName, listener); + rmAbort = () => signal.removeEventListener("abort", onAbort); + signal.addEventListener("abort", onAbort); + } + const eventListeners = this.#listeners[eventName] ||= []; + eventListeners.push({ + listener, + external: options?.external === true, + once: options?.once === true, + rmAbort + }); + } + _off(eventName, listener, options = null) { + const eventListeners = this.#listeners[eventName]; + if (!eventListeners) { + return; + } + for (let i = 0, ii = eventListeners.length; i < ii; i++) { + const evt = eventListeners[i]; + if (evt.listener === listener) { + evt.rmAbort?.(); + eventListeners.splice(i, 1); + return; + } + } + } +} +class FirefoxEventBus extends EventBus { + #externalServices; + #globalEventNames; + #isInAutomation; + constructor(globalEventNames, externalServices, isInAutomation) { + super(); + this.#globalEventNames = globalEventNames; + this.#externalServices = externalServices; + this.#isInAutomation = isInAutomation; + } + dispatch(eventName, data) { + throw new Error("Not implemented: FirefoxEventBus.dispatch"); + } +} + +;// ./web/external_services.js +class BaseExternalServices { + updateFindControlState(data) {} + updateFindMatchesCount(data) {} + initPassiveLoading() {} + reportTelemetry(data) {} + async createL10n() { + throw new Error("Not implemented: createL10n"); + } + createScripting() { + throw new Error("Not implemented: createScripting"); + } + createSignatureStorage() { + throw new Error("Not implemented: createSignatureStorage"); + } + updateEditorStates(data) { + throw new Error("Not implemented: updateEditorStates"); + } + dispatchGlobalEvent(_event) {} +} + +;// ./web/preferences.js + +class BasePreferences { + #defaults = Object.freeze({ + altTextLearnMoreUrl: "", + annotationEditorMode: 0, + annotationMode: 2, + capCanvasAreaFactor: 200, + commentLearnMoreUrl: "", + cursorToolOnLoad: 0, + defaultZoomDelay: 400, + defaultZoomValue: "", + disablePageLabels: false, + enableAltText: false, + enableAltTextModelDownload: true, + enableAutoLinking: true, + enableComment: false, + enableGuessAltText: true, + enableHighlightFloatingButton: false, + enableNewAltTextWhenAddingImage: true, + enableOptimizedPartialRendering: false, + enablePermissions: false, + enablePrintAutoRotate: true, + enableScripting: true, + enableSignatureEditor: false, + enableUpdatedAddImage: false, + externalLinkTarget: 0, + highlightEditorColors: "yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F,yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043", + historyUpdateUrl: false, + ignoreDestinationZoom: false, + forcePageColors: false, + pageColorsBackground: "Canvas", + pageColorsForeground: "CanvasText", + pdfBugEnabled: false, + sidebarViewOnLoad: -1, + scrollModeOnLoad: -1, + spreadModeOnLoad: -1, + textLayerMode: 1, + viewerCssTheme: 0, + viewOnLoad: 0, + disableAutoFetch: false, + disableFontFace: false, + disableRange: false, + disableStream: false, + enableHWA: true, + enableXfa: true + }); + #initializedPromise = null; + constructor() { + this.#initializedPromise = this._readFromStorage(this.#defaults).then(({ + browserPrefs, + prefs + }) => { + if (AppOptions._checkDisablePreferences()) { + return; + } + AppOptions.setAll({ + ...browserPrefs, + ...prefs + }, true); + }); + } + async _writeToStorage(prefObj) { + throw new Error("Not implemented: _writeToStorage"); + } + async _readFromStorage(prefObj) { + throw new Error("Not implemented: _readFromStorage"); + } + async reset() { + await this.#initializedPromise; + AppOptions.setAll(this.#defaults, true); + await this._writeToStorage(this.#defaults); + } + async set(name, value) { + await this.#initializedPromise; + AppOptions.setAll({ + [name]: value + }, true); + await this._writeToStorage(AppOptions.getAll(OptionKind.PREFERENCE)); + } + async get(name) { + await this.#initializedPromise; + return AppOptions.get(name); + } + get initializedPromise() { + return this.#initializedPromise; + } +} + +;// ./node_modules/@fluent/bundle/esm/types.js +class FluentType { + constructor(value) { + this.value = value; + } + valueOf() { + return this.value; + } +} +class FluentNone extends FluentType { + constructor(value = "???") { + super(value); + } + toString(scope) { + return `{${this.value}}`; + } +} +class FluentNumber extends FluentType { + constructor(value, opts = {}) { + super(value); + this.opts = opts; + } + toString(scope) { + if (scope) { + try { + const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts); + return nf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + return this.value.toString(10); + } +} +class FluentDateTime extends FluentType { + static supportsValue(value) { + if (typeof value === "number") return true; + if (value instanceof Date) return true; + if (value instanceof FluentType) return FluentDateTime.supportsValue(value.valueOf()); + if ("Temporal" in globalThis) { + const _Temporal = globalThis.Temporal; + if (value instanceof _Temporal.Instant || value instanceof _Temporal.PlainDateTime || value instanceof _Temporal.PlainDate || value instanceof _Temporal.PlainMonthDay || value instanceof _Temporal.PlainTime || value instanceof _Temporal.PlainYearMonth) { + return true; + } + } + return false; + } + constructor(value, opts = {}) { + if (value instanceof FluentDateTime) { + opts = { + ...value.opts, + ...opts + }; + value = value.value; + } else if (value instanceof FluentType) { + value = value.valueOf(); + } + if (typeof value === "object" && "calendarId" in value && opts.calendar === undefined) { + opts = { + ...opts, + calendar: value.calendarId + }; + } + super(value); + this.opts = opts; + } + [Symbol.toPrimitive](hint) { + return hint === "string" ? this.toString() : this.toNumber(); + } + toNumber() { + const value = this.value; + if (typeof value === "number") return value; + if (value instanceof Date) return value.getTime(); + if ("epochMilliseconds" in value) { + return value.epochMilliseconds; + } + if ("toZonedDateTime" in value) { + return value.toZonedDateTime("UTC").epochMilliseconds; + } + throw new TypeError("Unwrapping a non-number value as a number"); + } + toString(scope) { + if (scope) { + try { + const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts); + return dtf.format(this.value); + } catch (err) { + scope.reportError(err); + } + } + if (typeof this.value === "number" || this.value instanceof Date) { + return new Date(this.value).toISOString(); + } + return this.value.toString(); + } +} +;// ./node_modules/@fluent/bundle/esm/resolver.js + +const MAX_PLACEABLES = 100; +const FSI = "\u2068"; +const PDI = "\u2069"; +function match(scope, selector, key) { + if (key === selector) { + return true; + } + if (key instanceof FluentNumber && selector instanceof FluentNumber && key.value === selector.value) { + return true; + } + if (selector instanceof FluentNumber && typeof key === "string") { + let category = scope.memoizeIntlObject(Intl.PluralRules, selector.opts).select(selector.value); + if (key === category) { + return true; + } + } + return false; +} +function getDefault(scope, variants, star) { + if (variants[star]) { + return resolvePattern(scope, variants[star].value); + } + scope.reportError(new RangeError("No default")); + return new FluentNone(); +} +function getArguments(scope, args) { + const positional = []; + const named = Object.create(null); + for (const arg of args) { + if (arg.type === "narg") { + named[arg.name] = resolveExpression(scope, arg.value); + } else { + positional.push(resolveExpression(scope, arg)); + } + } + return { + positional, + named + }; +} +function resolveExpression(scope, expr) { + switch (expr.type) { + case "str": + return expr.value; + case "num": + return new FluentNumber(expr.value, { + minimumFractionDigits: expr.precision + }); + case "var": + return resolveVariableReference(scope, expr); + case "mesg": + return resolveMessageReference(scope, expr); + case "term": + return resolveTermReference(scope, expr); + case "func": + return resolveFunctionReference(scope, expr); + case "select": + return resolveSelectExpression(scope, expr); + default: + return new FluentNone(); + } +} +function resolveVariableReference(scope, { + name +}) { + let arg; + if (scope.params) { + if (Object.prototype.hasOwnProperty.call(scope.params, name)) { + arg = scope.params[name]; + } else { + return new FluentNone(`$${name}`); + } + } else if (scope.args && Object.prototype.hasOwnProperty.call(scope.args, name)) { + arg = scope.args[name]; + } else { + scope.reportError(new ReferenceError(`Unknown variable: $${name}`)); + return new FluentNone(`$${name}`); + } + if (arg instanceof FluentType) { + return arg; + } + switch (typeof arg) { + case "string": + return arg; + case "number": + return new FluentNumber(arg); + case "object": + if (FluentDateTime.supportsValue(arg)) { + return new FluentDateTime(arg); + } + default: + scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`)); + return new FluentNone(`$${name}`); + } +} +function resolveMessageReference(scope, { + name, + attr +}) { + const message = scope.bundle._messages.get(name); + if (!message) { + scope.reportError(new ReferenceError(`Unknown message: ${name}`)); + return new FluentNone(name); + } + if (attr) { + const attribute = message.attributes[attr]; + if (attribute) { + return resolvePattern(scope, attribute); + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${name}.${attr}`); + } + if (message.value) { + return resolvePattern(scope, message.value); + } + scope.reportError(new ReferenceError(`No value: ${name}`)); + return new FluentNone(name); +} +function resolveTermReference(scope, { + name, + attr, + args +}) { + const id = `-${name}`; + const term = scope.bundle._terms.get(id); + if (!term) { + scope.reportError(new ReferenceError(`Unknown term: ${id}`)); + return new FluentNone(id); + } + if (attr) { + const attribute = term.attributes[attr]; + if (attribute) { + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, attribute); + scope.params = null; + return resolved; + } + scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`)); + return new FluentNone(`${id}.${attr}`); + } + scope.params = getArguments(scope, args).named; + const resolved = resolvePattern(scope, term.value); + scope.params = null; + return resolved; +} +function resolveFunctionReference(scope, { + name, + args +}) { + let func = scope.bundle._functions[name]; + if (!func) { + scope.reportError(new ReferenceError(`Unknown function: ${name}()`)); + return new FluentNone(`${name}()`); + } + if (typeof func !== "function") { + scope.reportError(new TypeError(`Function ${name}() is not callable`)); + return new FluentNone(`${name}()`); + } + try { + let resolved = getArguments(scope, args); + return func(resolved.positional, resolved.named); + } catch (err) { + scope.reportError(err); + return new FluentNone(`${name}()`); + } +} +function resolveSelectExpression(scope, { + selector, + variants, + star +}) { + let sel = resolveExpression(scope, selector); + if (sel instanceof FluentNone) { + return getDefault(scope, variants, star); + } + for (const variant of variants) { + const key = resolveExpression(scope, variant.key); + if (match(scope, sel, key)) { + return resolvePattern(scope, variant.value); + } + } + return getDefault(scope, variants, star); +} +function resolveComplexPattern(scope, ptn) { + if (scope.dirty.has(ptn)) { + scope.reportError(new RangeError("Cyclic reference")); + return new FluentNone(); + } + scope.dirty.add(ptn); + const result = []; + const useIsolating = scope.bundle._useIsolating && ptn.length > 1; + for (const elem of ptn) { + if (typeof elem === "string") { + result.push(scope.bundle._transform(elem)); + continue; + } + scope.placeables++; + if (scope.placeables > MAX_PLACEABLES) { + scope.dirty.delete(ptn); + throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` + `max allowed is ${MAX_PLACEABLES}`); + } + if (useIsolating) { + result.push(FSI); + } + result.push(resolveExpression(scope, elem).toString(scope)); + if (useIsolating) { + result.push(PDI); + } + } + scope.dirty.delete(ptn); + return result.join(""); +} +function resolvePattern(scope, value) { + if (typeof value === "string") { + return scope.bundle._transform(value); + } + return resolveComplexPattern(scope, value); +} +;// ./node_modules/@fluent/bundle/esm/scope.js +class Scope { + constructor(bundle, errors, args) { + this.dirty = new WeakSet(); + this.params = null; + this.placeables = 0; + this.bundle = bundle; + this.errors = errors; + this.args = args; + } + reportError(error) { + if (!this.errors || !(error instanceof Error)) { + throw error; + } + this.errors.push(error); + } + memoizeIntlObject(ctor, opts) { + let cache = this.bundle._intls.get(ctor); + if (!cache) { + cache = {}; + this.bundle._intls.set(ctor, cache); + } + let id = JSON.stringify(opts); + if (!cache[id]) { + cache[id] = new ctor(this.bundle.locales, opts); + } + return cache[id]; + } +} +;// ./node_modules/@fluent/bundle/esm/builtins.js + +function values(opts, allowed) { + const unwrapped = Object.create(null); + for (const [name, opt] of Object.entries(opts)) { + if (allowed.includes(name)) { + unwrapped[name] = opt.valueOf(); + } + } + return unwrapped; +} +const NUMBER_ALLOWED = ["unitDisplay", "currencyDisplay", "useGrouping", "minimumIntegerDigits", "minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"]; +function NUMBER(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`NUMBER(${arg.valueOf()})`); + } + if (arg instanceof FluentNumber) { + return new FluentNumber(arg.valueOf(), { + ...arg.opts, + ...values(opts, NUMBER_ALLOWED) + }); + } + if (arg instanceof FluentDateTime) { + return new FluentNumber(arg.toNumber(), { + ...values(opts, NUMBER_ALLOWED) + }); + } + throw new TypeError("Invalid argument to NUMBER"); +} +const DATETIME_ALLOWED = ["dateStyle", "timeStyle", "fractionalSecondDigits", "dayPeriod", "hour12", "weekday", "era", "year", "month", "day", "hour", "minute", "second", "timeZoneName"]; +function DATETIME(args, opts) { + let arg = args[0]; + if (arg instanceof FluentNone) { + return new FluentNone(`DATETIME(${arg.valueOf()})`); + } + if (arg instanceof FluentDateTime || arg instanceof FluentNumber) { + return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED)); + } + throw new TypeError("Invalid argument to DATETIME"); +} +;// ./node_modules/@fluent/bundle/esm/memoizer.js +const cache = new Map(); +function getMemoizerForLocale(locales) { + const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; + let memoizer = cache.get(stringLocale); + if (memoizer === undefined) { + memoizer = new Map(); + cache.set(stringLocale, memoizer); + } + return memoizer; +} +;// ./node_modules/@fluent/bundle/esm/bundle.js + + + + + +class FluentBundle { + constructor(locales, { + functions, + useIsolating = true, + transform = v => v + } = {}) { + this._terms = new Map(); + this._messages = new Map(); + this.locales = Array.isArray(locales) ? locales : [locales]; + this._functions = { + NUMBER: NUMBER, + DATETIME: DATETIME, + ...functions + }; + this._useIsolating = useIsolating; + this._transform = transform; + this._intls = getMemoizerForLocale(locales); + } + hasMessage(id) { + return this._messages.has(id); + } + getMessage(id) { + return this._messages.get(id); + } + addResource(res, { + allowOverrides = false + } = {}) { + const errors = []; + for (let i = 0; i < res.body.length; i++) { + let entry = res.body[i]; + if (entry.id.startsWith("-")) { + if (allowOverrides === false && this._terms.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing term: "${entry.id}"`)); + continue; + } + this._terms.set(entry.id, entry); + } else { + if (allowOverrides === false && this._messages.has(entry.id)) { + errors.push(new Error(`Attempt to override an existing message: "${entry.id}"`)); + continue; + } + this._messages.set(entry.id, entry); + } + } + return errors; + } + formatPattern(pattern, args = null, errors = null) { + if (typeof pattern === "string") { + return this._transform(pattern); + } + let scope = new Scope(this, errors, args); + try { + let value = resolveComplexPattern(scope, pattern); + return value.toString(scope); + } catch (err) { + if (scope.errors && err instanceof Error) { + scope.errors.push(err); + return new FluentNone().toString(scope); + } + throw err; + } + } +} +;// ./node_modules/@fluent/bundle/esm/resource.js +const RE_MESSAGE_START = /^(-?[a-zA-Z][\w-]*) *= */gm; +const RE_ATTRIBUTE_START = /\.([a-zA-Z][\w-]*) *= */y; +const RE_VARIANT_START = /\*?\[/y; +const RE_NUMBER_LITERAL = /(-?[0-9]+(?:\.([0-9]+))?)/y; +const RE_IDENTIFIER = /([a-zA-Z][\w-]*)/y; +const RE_REFERENCE = /([$-])?([a-zA-Z][\w-]*)(?:\.([a-zA-Z][\w-]*))?/y; +const RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/; +const RE_TEXT_RUN = /([^{}\n\r]+)/y; +const RE_STRING_RUN = /([^\\"\n\r]*)/y; +const RE_STRING_ESCAPE = /\\([\\"])/y; +const RE_UNICODE_ESCAPE = /\\u([a-fA-F0-9]{4})|\\U([a-fA-F0-9]{6})/y; +const RE_LEADING_NEWLINES = /^\n+/; +const RE_TRAILING_SPACES = / +$/; +const RE_BLANK_LINES = / *\r?\n/g; +const RE_INDENT = /( *)$/; +const TOKEN_BRACE_OPEN = /{\s*/y; +const TOKEN_BRACE_CLOSE = /\s*}/y; +const TOKEN_BRACKET_OPEN = /\[\s*/y; +const TOKEN_BRACKET_CLOSE = /\s*] */y; +const TOKEN_PAREN_OPEN = /\s*\(\s*/y; +const TOKEN_ARROW = /\s*->\s*/y; +const TOKEN_COLON = /\s*:\s*/y; +const TOKEN_COMMA = /\s*,?\s*/y; +const TOKEN_BLANK = /\s+/y; +class FluentResource { + constructor(source) { + this.body = []; + RE_MESSAGE_START.lastIndex = 0; + let cursor = 0; + while (true) { + let next = RE_MESSAGE_START.exec(source); + if (next === null) { + break; + } + cursor = RE_MESSAGE_START.lastIndex; + try { + this.body.push(parseMessage(next[1])); + } catch (err) { + if (err instanceof SyntaxError) { + continue; + } + throw err; + } + } + function test(re) { + re.lastIndex = cursor; + return re.test(source); + } + function consumeChar(char, errorClass) { + if (source[cursor] === char) { + cursor++; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${char}`); + } + return false; + } + function consumeToken(re, errorClass) { + if (test(re)) { + cursor = re.lastIndex; + return true; + } + if (errorClass) { + throw new errorClass(`Expected ${re.toString()}`); + } + return false; + } + function match(re) { + re.lastIndex = cursor; + let result = re.exec(source); + if (result === null) { + throw new SyntaxError(`Expected ${re.toString()}`); + } + cursor = re.lastIndex; + return result; + } + function match1(re) { + return match(re)[1]; + } + function parseMessage(id) { + let value = parsePattern(); + let attributes = parseAttributes(); + if (value === null && Object.keys(attributes).length === 0) { + throw new SyntaxError("Expected message value or attributes"); + } + return { + id, + value, + attributes + }; + } + function parseAttributes() { + let attrs = Object.create(null); + while (test(RE_ATTRIBUTE_START)) { + let name = match1(RE_ATTRIBUTE_START); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected attribute value"); + } + attrs[name] = value; + } + return attrs; + } + function parsePattern() { + let first; + if (test(RE_TEXT_RUN)) { + first = match1(RE_TEXT_RUN); + } + if (source[cursor] === "{" || source[cursor] === "}") { + return parsePatternElements(first ? [first] : [], Infinity); + } + let indent = parseIndent(); + if (indent) { + if (first) { + return parsePatternElements([first, indent], indent.length); + } + indent.value = trim(indent.value, RE_LEADING_NEWLINES); + return parsePatternElements([indent], indent.length); + } + if (first) { + return trim(first, RE_TRAILING_SPACES); + } + return null; + } + function parsePatternElements(elements = [], commonIndent) { + while (true) { + if (test(RE_TEXT_RUN)) { + elements.push(match1(RE_TEXT_RUN)); + continue; + } + if (source[cursor] === "{") { + elements.push(parsePlaceable()); + continue; + } + if (source[cursor] === "}") { + throw new SyntaxError("Unbalanced closing brace"); + } + let indent = parseIndent(); + if (indent) { + elements.push(indent); + commonIndent = Math.min(commonIndent, indent.length); + continue; + } + break; + } + let lastIndex = elements.length - 1; + let lastElement = elements[lastIndex]; + if (typeof lastElement === "string") { + elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES); + } + let baked = []; + for (let element of elements) { + if (element instanceof Indent) { + element = element.value.slice(0, element.value.length - commonIndent); + } + if (element) { + baked.push(element); + } + } + return baked; + } + function parsePlaceable() { + consumeToken(TOKEN_BRACE_OPEN, SyntaxError); + let selector = parseInlineExpression(); + if (consumeToken(TOKEN_BRACE_CLOSE)) { + return selector; + } + if (consumeToken(TOKEN_ARROW)) { + let variants = parseVariants(); + consumeToken(TOKEN_BRACE_CLOSE, SyntaxError); + return { + type: "select", + selector, + ...variants + }; + } + throw new SyntaxError("Unclosed placeable"); + } + function parseInlineExpression() { + if (source[cursor] === "{") { + return parsePlaceable(); + } + if (test(RE_REFERENCE)) { + let [, sigil, name, attr = null] = match(RE_REFERENCE); + if (sigil === "$") { + return { + type: "var", + name + }; + } + if (consumeToken(TOKEN_PAREN_OPEN)) { + let args = parseArguments(); + if (sigil === "-") { + return { + type: "term", + name, + attr, + args + }; + } + if (RE_FUNCTION_NAME.test(name)) { + return { + type: "func", + name, + args + }; + } + throw new SyntaxError("Function names must be all upper-case"); + } + if (sigil === "-") { + return { + type: "term", + name, + attr, + args: [] + }; + } + return { + type: "mesg", + name, + attr + }; + } + return parseLiteral(); + } + function parseArguments() { + let args = []; + while (true) { + switch (source[cursor]) { + case ")": + cursor++; + return args; + case undefined: + throw new SyntaxError("Unclosed argument list"); + } + args.push(parseArgument()); + consumeToken(TOKEN_COMMA); + } + } + function parseArgument() { + let expr = parseInlineExpression(); + if (expr.type !== "mesg") { + return expr; + } + if (consumeToken(TOKEN_COLON)) { + return { + type: "narg", + name: expr.name, + value: parseLiteral() + }; + } + return expr; + } + function parseVariants() { + let variants = []; + let count = 0; + let star; + while (test(RE_VARIANT_START)) { + if (consumeChar("*")) { + star = count; + } + let key = parseVariantKey(); + let value = parsePattern(); + if (value === null) { + throw new SyntaxError("Expected variant value"); + } + variants[count++] = { + key, + value + }; + } + if (count === 0) { + return null; + } + if (star === undefined) { + throw new SyntaxError("Expected default variant"); + } + return { + variants, + star + }; + } + function parseVariantKey() { + consumeToken(TOKEN_BRACKET_OPEN, SyntaxError); + let key; + if (test(RE_NUMBER_LITERAL)) { + key = parseNumberLiteral(); + } else { + key = { + type: "str", + value: match1(RE_IDENTIFIER) + }; + } + consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError); + return key; + } + function parseLiteral() { + if (test(RE_NUMBER_LITERAL)) { + return parseNumberLiteral(); + } + if (source[cursor] === '"') { + return parseStringLiteral(); + } + throw new SyntaxError("Invalid expression"); + } + function parseNumberLiteral() { + let [, value, fraction = ""] = match(RE_NUMBER_LITERAL); + let precision = fraction.length; + return { + type: "num", + value: parseFloat(value), + precision + }; + } + function parseStringLiteral() { + consumeChar('"', SyntaxError); + let value = ""; + while (true) { + value += match1(RE_STRING_RUN); + if (source[cursor] === "\\") { + value += parseEscapeSequence(); + continue; + } + if (consumeChar('"')) { + return { + type: "str", + value + }; + } + throw new SyntaxError("Unclosed string literal"); + } + } + function parseEscapeSequence() { + if (test(RE_STRING_ESCAPE)) { + return match1(RE_STRING_ESCAPE); + } + if (test(RE_UNICODE_ESCAPE)) { + let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE); + let codepoint = parseInt(codepoint4 || codepoint6, 16); + return codepoint <= 0xd7ff || 0xe000 <= codepoint ? String.fromCodePoint(codepoint) : "�"; + } + throw new SyntaxError("Unknown escape sequence"); + } + function parseIndent() { + let start = cursor; + consumeToken(TOKEN_BLANK); + switch (source[cursor]) { + case ".": + case "[": + case "*": + case "}": + case undefined: + return false; + case "{": + return makeIndent(source.slice(start, cursor)); + } + if (source[cursor - 1] === " ") { + return makeIndent(source.slice(start, cursor)); + } + return false; + } + function trim(text, re) { + return text.replace(re, ""); + } + function makeIndent(blank) { + let value = blank.replace(RE_BLANK_LINES, "\n"); + let length = RE_INDENT.exec(blank)[1].length; + return new Indent(value, length); + } + } +} +class Indent { + constructor(value, length) { + this.value = value; + this.length = length; + } +} +;// ./node_modules/@fluent/bundle/esm/index.js + + + +;// ./node_modules/@fluent/dom/esm/overlay.js +const reOverlay = /<|&#?\w+;/; +const TEXT_LEVEL_ELEMENTS = { + "http://www.w3.org/1999/xhtml": ["em", "strong", "small", "s", "cite", "q", "dfn", "abbr", "data", "time", "code", "var", "samp", "kbd", "sub", "sup", "i", "b", "u", "mark", "bdi", "bdo", "span", "br", "wbr"] +}; +const LOCALIZABLE_ATTRIBUTES = { + "http://www.w3.org/1999/xhtml": { + global: ["title", "aria-description", "aria-label", "aria-valuetext"], + a: ["download"], + area: ["download", "alt"], + input: ["alt", "placeholder"], + menuitem: ["label"], + menu: ["label"], + optgroup: ["label"], + option: ["label"], + track: ["label"], + img: ["alt"], + textarea: ["placeholder"], + th: ["abbr"] + }, + "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": { + global: ["accesskey", "aria-label", "aria-valuetext", "label", "title", "tooltiptext"], + description: ["value"], + key: ["key", "keycode"], + label: ["value"], + textbox: ["placeholder", "value"] + } +}; +function translateElement(element, translation) { + const { + value + } = translation; + if (typeof value === "string") { + if (element.localName === "title" && element.namespaceURI === "http://www.w3.org/1999/xhtml") { + element.textContent = value; + } else if (!reOverlay.test(value)) { + element.textContent = value; + } else { + const templateElement = element.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "template"); + templateElement.innerHTML = value; + overlayChildNodes(templateElement.content, element); + } + } + overlayAttributes(translation, element); +} +function overlayChildNodes(fromFragment, toElement) { + for (const childNode of fromFragment.childNodes) { + if (childNode.nodeType === childNode.TEXT_NODE) { + continue; + } + if (childNode.hasAttribute("data-l10n-name")) { + const sanitized = getNodeForNamedElement(toElement, childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + if (isElementAllowed(childNode)) { + const sanitized = createSanitizedElement(childNode); + fromFragment.replaceChild(sanitized, childNode); + continue; + } + console.warn(`An element of forbidden type "${childNode.localName}" was found in ` + "the translation. Only safe text-level elements and elements with " + "data-l10n-name are allowed."); + fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode); + } + toElement.textContent = ""; + toElement.appendChild(fromFragment); +} +function hasAttribute(attributes, name) { + if (!attributes) { + return false; + } + for (let attr of attributes) { + if (attr.name === name) { + return true; + } + } + return false; +} +function overlayAttributes(fromElement, toElement) { + const explicitlyAllowed = toElement.hasAttribute("data-l10n-attrs") ? toElement.getAttribute("data-l10n-attrs").split(",").map(i => i.trim()) : null; + for (const attr of Array.from(toElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && !hasAttribute(fromElement.attributes, attr.name)) { + toElement.removeAttribute(attr.name); + } + } + if (!fromElement.attributes) { + return; + } + for (const attr of Array.from(fromElement.attributes)) { + if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) && toElement.getAttribute(attr.name) !== attr.value) { + toElement.setAttribute(attr.name, attr.value); + } + } +} +function getNodeForNamedElement(sourceElement, translatedChild) { + const childName = translatedChild.getAttribute("data-l10n-name"); + const sourceChild = sourceElement.querySelector(`[data-l10n-name="${childName}"]`); + if (!sourceChild) { + console.warn(`An element named "${childName}" wasn't found in the source.`); + return createTextNodeFromTextContent(translatedChild); + } + if (sourceChild.localName !== translatedChild.localName) { + console.warn(`An element named "${childName}" was found in the translation ` + `but its type ${translatedChild.localName} didn't match the ` + `element found in the source (${sourceChild.localName}).`); + return createTextNodeFromTextContent(translatedChild); + } + sourceElement.removeChild(sourceChild); + const clone = sourceChild.cloneNode(false); + return shallowPopulateUsing(translatedChild, clone); +} +function createSanitizedElement(element) { + const clone = element.ownerDocument.createElement(element.localName); + return shallowPopulateUsing(element, clone); +} +function createTextNodeFromTextContent(element) { + return element.ownerDocument.createTextNode(element.textContent); +} +function isElementAllowed(element) { + const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI]; + return allowed && allowed.includes(element.localName); +} +function isAttrNameLocalizable(name, element, explicitlyAllowed = null) { + if (explicitlyAllowed && explicitlyAllowed.includes(name)) { + return true; + } + const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI]; + if (!allowed) { + return false; + } + const attrName = name.toLowerCase(); + const elemName = element.localName; + if (allowed.global.includes(attrName)) { + return true; + } + if (!allowed[elemName]) { + return false; + } + if (allowed[elemName].includes(attrName)) { + return true; + } + if (element.namespaceURI === "http://www.w3.org/1999/xhtml" && elemName === "input" && attrName === "value") { + const type = element.type.toLowerCase(); + if (type === "submit" || type === "button" || type === "reset") { + return true; + } + } + return false; +} +function shallowPopulateUsing(fromElement, toElement) { + toElement.textContent = fromElement.textContent; + overlayAttributes(fromElement, toElement); + return toElement; +} +;// ./node_modules/cached-iterable/src/cached_iterable.mjs +class CachedIterable extends Array { + static from(iterable) { + if (iterable instanceof this) { + return iterable; + } + return new this(iterable); + } +} +;// ./node_modules/cached-iterable/src/cached_sync_iterable.mjs + +class CachedSyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.iterator]() { + const cached = this; + let cur = 0; + return { + next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && last.done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/cached_async_iterable.mjs + +class CachedAsyncIterable extends CachedIterable { + constructor(iterable) { + super(); + if (Symbol.asyncIterator in Object(iterable)) { + this.iterator = iterable[Symbol.asyncIterator](); + } else if (Symbol.iterator in Object(iterable)) { + this.iterator = iterable[Symbol.iterator](); + } else { + throw new TypeError("Argument must implement the iteration protocol."); + } + } + [Symbol.asyncIterator]() { + const cached = this; + let cur = 0; + return { + async next() { + if (cached.length <= cur) { + cached.push(cached.iterator.next()); + } + return cached[cur++]; + } + }; + } + async touchNext(count = 1) { + let idx = 0; + while (idx++ < count) { + const last = this[this.length - 1]; + if (last && (await last).done) { + break; + } + this.push(this.iterator.next()); + } + return this[this.length - 1]; + } +} +;// ./node_modules/cached-iterable/src/index.mjs + + +;// ./node_modules/@fluent/dom/esm/localization.js + +class Localization { + constructor(resourceIds = [], generateBundles) { + this.resourceIds = resourceIds; + this.generateBundles = generateBundles; + this.onChange(true); + } + addResourceIds(resourceIds, eager = false) { + this.resourceIds.push(...resourceIds); + this.onChange(eager); + return this.resourceIds.length; + } + removeResourceIds(resourceIds) { + this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r)); + this.onChange(); + return this.resourceIds.length; + } + async formatWithFallback(keys, method) { + const translations = []; + let hasAtLeastOneBundle = false; + for await (const bundle of this.bundles) { + hasAtLeastOneBundle = true; + const missingIds = keysFromBundle(method, bundle, keys, translations); + if (missingIds.size === 0) { + break; + } + if (typeof console !== "undefined") { + const locale = bundle.locales[0]; + const ids = Array.from(missingIds).join(", "); + console.warn(`[fluent] Missing translations in ${locale}: ${ids}`); + } + } + if (!hasAtLeastOneBundle && typeof console !== "undefined") { + console.warn(`[fluent] Request for keys failed because no resource bundles got generated. + keys: ${JSON.stringify(keys)}. + resourceIds: ${JSON.stringify(this.resourceIds)}.`); + } + return translations; + } + formatMessages(keys) { + return this.formatWithFallback(keys, messageFromBundle); + } + formatValues(keys) { + return this.formatWithFallback(keys, valueFromBundle); + } + async formatValue(id, args) { + const [val] = await this.formatValues([{ + id, + args + }]); + return val; + } + handleEvent() { + this.onChange(); + } + onChange(eager = false) { + this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds)); + if (eager) { + this.bundles.touchNext(2); + } + } +} +function valueFromBundle(bundle, errors, message, args) { + if (message.value) { + return bundle.formatPattern(message.value, args, errors); + } + return null; +} +function messageFromBundle(bundle, errors, message, args) { + const formatted = { + value: null, + attributes: null + }; + if (message.value) { + formatted.value = bundle.formatPattern(message.value, args, errors); + } + let attrNames = Object.keys(message.attributes); + if (attrNames.length > 0) { + formatted.attributes = new Array(attrNames.length); + for (let [i, name] of attrNames.entries()) { + let value = bundle.formatPattern(message.attributes[name], args, errors); + formatted.attributes[i] = { + name, + value + }; + } + } + return formatted; +} +function keysFromBundle(method, bundle, keys, translations) { + const messageErrors = []; + const missingIds = new Set(); + keys.forEach(({ + id, + args + }, i) => { + if (translations[i] !== undefined) { + return; + } + let message = bundle.getMessage(id); + if (message) { + messageErrors.length = 0; + translations[i] = method(bundle, messageErrors, message, args); + if (messageErrors.length > 0 && typeof console !== "undefined") { + const locale = bundle.locales[0]; + const errors = messageErrors.join(", "); + console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`); + } + } else { + missingIds.add(id); + } + }); + return missingIds; +} +;// ./node_modules/@fluent/dom/esm/dom_localization.js + + +const L10NID_ATTR_NAME = "data-l10n-id"; +const L10NARGS_ATTR_NAME = "data-l10n-args"; +const L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`; +class DOMLocalization extends Localization { + constructor(resourceIds, generateBundles) { + super(resourceIds, generateBundles); + this.roots = new Set(); + this.pendingrAF = null; + this.pendingElements = new Set(); + this.windowElement = null; + this.mutationObserver = null; + this.observerConfig = { + attributes: true, + characterData: false, + childList: true, + subtree: true, + attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME] + }; + } + onChange(eager = false) { + super.onChange(eager); + if (this.roots) { + this.translateRoots(); + } + } + setAttributes(element, id, args) { + element.setAttribute(L10NID_ATTR_NAME, id); + if (args) { + element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args)); + } else { + element.removeAttribute(L10NARGS_ATTR_NAME); + } + return element; + } + getAttributes(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } + connectRoot(newRoot) { + for (const root of this.roots) { + if (root === newRoot || root.contains(newRoot) || newRoot.contains(root)) { + throw new Error("Cannot add a root that overlaps with existing root."); + } + } + if (this.windowElement) { + if (this.windowElement !== newRoot.ownerDocument.defaultView) { + throw new Error(`Cannot connect a root: + DOMLocalization already has a root from a different window.`); + } + } else { + this.windowElement = newRoot.ownerDocument.defaultView; + this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations)); + } + this.roots.add(newRoot); + this.mutationObserver.observe(newRoot, this.observerConfig); + } + disconnectRoot(root) { + this.roots.delete(root); + this.pauseObserving(); + if (this.roots.size === 0) { + this.mutationObserver = null; + if (this.windowElement && this.pendingrAF) { + this.windowElement.cancelAnimationFrame(this.pendingrAF); + } + this.windowElement = null; + this.pendingrAF = null; + this.pendingElements.clear(); + return true; + } + this.resumeObserving(); + return false; + } + translateRoots() { + const roots = Array.from(this.roots); + return Promise.all(roots.map(root => this.translateFragment(root))); + } + pauseObserving() { + if (!this.mutationObserver) { + return; + } + this.translateMutations(this.mutationObserver.takeRecords()); + this.mutationObserver.disconnect(); + } + resumeObserving() { + if (!this.mutationObserver) { + return; + } + for (const root of this.roots) { + this.mutationObserver.observe(root, this.observerConfig); + } + } + translateMutations(mutations) { + for (const mutation of mutations) { + switch (mutation.type) { + case "attributes": + if (mutation.target.hasAttribute("data-l10n-id")) { + this.pendingElements.add(mutation.target); + } + break; + case "childList": + for (const addedNode of mutation.addedNodes) { + if (addedNode.nodeType === addedNode.ELEMENT_NODE) { + if (addedNode.childElementCount) { + for (const element of this.getTranslatables(addedNode)) { + this.pendingElements.add(element); + } + } else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) { + this.pendingElements.add(addedNode); + } + } + } + break; + } + } + if (this.pendingElements.size > 0) { + if (this.pendingrAF === null) { + this.pendingrAF = this.windowElement.requestAnimationFrame(() => { + this.translateElements(Array.from(this.pendingElements)); + this.pendingElements.clear(); + this.pendingrAF = null; + }); + } + } + } + translateFragment(frag) { + return this.translateElements(this.getTranslatables(frag)); + } + async translateElements(elements) { + if (!elements.length) { + return undefined; + } + const keys = elements.map(this.getKeysForElement); + const translations = await this.formatMessages(keys); + return this.applyTranslations(elements, translations); + } + applyTranslations(elements, translations) { + this.pauseObserving(); + for (let i = 0; i < elements.length; i++) { + if (translations[i] !== undefined) { + translateElement(elements[i], translations[i]); + } + } + this.resumeObserving(); + } + getTranslatables(element) { + const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY)); + if (typeof element.hasAttribute === "function" && element.hasAttribute(L10NID_ATTR_NAME)) { + nodes.push(element); + } + return nodes; + } + getKeysForElement(element) { + return { + id: element.getAttribute(L10NID_ATTR_NAME), + args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null) + }; + } +} +;// ./node_modules/@fluent/dom/esm/index.js + + +;// ./web/l10n.js +class L10n { + #dir; + #elements; + #lang; + #l10n; + constructor({ + lang, + isRTL + }, l10n = null) { + this.#lang = L10n.#fixupLangCode(lang); + this.#l10n = l10n; + this.#dir = isRTL ?? L10n.#isRTL(this.#lang) ? "rtl" : "ltr"; + } + _setL10n(l10n) { + this.#l10n = l10n; + } + getLanguage() { + return this.#lang; + } + getDirection() { + return this.#dir; + } + async get(ids, args = null, fallback) { + if (Array.isArray(ids)) { + ids = ids.map(id => ({ + id + })); + const messages = await this.#l10n.formatMessages(ids); + return messages.map(message => message.value); + } + const messages = await this.#l10n.formatMessages([{ + id: ids, + args + }]); + return messages[0]?.value || fallback; + } + async translate(element) { + (this.#elements ||= new Set()).add(element); + try { + this.#l10n.connectRoot(element); + await this.#l10n.translateRoots(); + } catch {} + } + async translateOnce(element) { + try { + await this.#l10n.translateElements([element]); + } catch (ex) { + console.error("translateOnce:", ex); + } + } + async destroy() { + if (this.#elements) { + for (const element of this.#elements) { + this.#l10n.disconnectRoot(element); + } + this.#elements.clear(); + this.#elements = null; + } + this.#l10n.pauseObserving(); + } + pause() { + this.#l10n.pauseObserving(); + } + resume() { + this.#l10n.resumeObserving(); + } + static #fixupLangCode(langCode) { + langCode = langCode?.toLowerCase() || "en-us"; + const PARTIAL_LANG_CODES = { + en: "en-us", + es: "es-es", + fy: "fy-nl", + ga: "ga-ie", + gu: "gu-in", + hi: "hi-in", + hy: "hy-am", + nb: "nb-no", + ne: "ne-np", + nn: "nn-no", + pa: "pa-in", + pt: "pt-pt", + sv: "sv-se", + zh: "zh-cn" + }; + return PARTIAL_LANG_CODES[langCode] || langCode; + } + static #isRTL(lang) { + const shortCode = lang.split("-", 1)[0]; + return ["ar", "he", "fa", "ps", "ur"].includes(shortCode); + } +} +const GenericL10n = null; + +;// ./web/genericl10n.js + + + + +function PLATFORM() { + const { + isAndroid, + isLinux, + isMac, + isWindows + } = FeatureTest.platform; + if (isLinux) { + return "linux"; + } + if (isWindows) { + return "windows"; + } + if (isMac) { + return "macos"; + } + if (isAndroid) { + return "android"; + } + return "other"; +} +function createBundle(lang, text) { + const resource = new FluentResource(text); + const bundle = new FluentBundle(lang, { + functions: { + PLATFORM + } + }); + const errors = bundle.addResource(resource); + if (errors.length) { + console.error("L10n errors", errors); + } + return bundle; +} +class genericl10n_GenericL10n extends L10n { + constructor(lang) { + super({ + lang + }); + const generateBundles = !lang ? genericl10n_GenericL10n.#generateBundlesFallback.bind(genericl10n_GenericL10n, this.getLanguage()) : genericl10n_GenericL10n.#generateBundles.bind(genericl10n_GenericL10n, "en-us", this.getLanguage()); + this._setL10n(new DOMLocalization([], generateBundles)); + } + static async *#generateBundles(defaultLang, baseLang) { + const { + baseURL, + paths + } = await this.#getPaths(); + const langs = [baseLang]; + if (defaultLang !== baseLang) { + const shortLang = baseLang.split("-", 1)[0]; + if (shortLang !== baseLang) { + langs.push(shortLang); + } + langs.push(defaultLang); + } + const bundles = langs.map(lang => [lang, this.#createBundle(lang, baseURL, paths)]); + for (const [lang, bundlePromise] of bundles) { + const bundle = await bundlePromise; + if (bundle) { + yield bundle; + } else if (lang === "en-us") { + yield this.#createBundleFallback(lang); + } + } + } + static async #createBundle(lang, baseURL, paths) { + const path = paths[lang]; + if (!path) { + return null; + } + const url = new URL(path, baseURL); + const text = await fetchData(url, "text"); + return createBundle(lang, text); + } + static async #getPaths() { + try { + const { + href + } = document.querySelector(`link[type="application/l10n"]`); + const paths = await fetchData(href, "json"); + return { + baseURL: href.substring(0, href.lastIndexOf("/") + 1) || "./", + paths + }; + } catch {} + return { + baseURL: "./", + paths: Object.create(null) + }; + } + static async *#generateBundlesFallback(lang) { + yield this.#createBundleFallback(lang); + } + static async #createBundleFallback(lang) { + const text = "pdfjs-previous-button =\n .title = Previous Page\npdfjs-previous-button-label = Previous\npdfjs-next-button =\n .title = Next Page\npdfjs-next-button-label = Next\npdfjs-page-input =\n .title = Page\npdfjs-of-pages = of { $pagesCount }\npdfjs-page-of-pages = ({ $pageNumber } of { $pagesCount })\npdfjs-zoom-out-button =\n .title = Zoom Out\npdfjs-zoom-out-button-label = Zoom Out\npdfjs-zoom-in-button =\n .title = Zoom In\npdfjs-zoom-in-button-label = Zoom In\npdfjs-zoom-select =\n .title = Zoom\npdfjs-presentation-mode-button =\n .title = Switch to Presentation Mode\npdfjs-presentation-mode-button-label = Presentation Mode\npdfjs-open-file-button =\n .title = Open File\npdfjs-open-file-button-label = Open\npdfjs-print-button =\n .title = Print\npdfjs-print-button-label = Print\npdfjs-save-button =\n .title = Save\npdfjs-save-button-label = Save\npdfjs-download-button =\n .title = Download\npdfjs-download-button-label = Download\npdfjs-bookmark-button =\n .title = Current Page (View URL from Current Page)\npdfjs-bookmark-button-label = Current Page\npdfjs-tools-button =\n .title = Tools\npdfjs-tools-button-label = Tools\npdfjs-first-page-button =\n .title = Go to First Page\npdfjs-first-page-button-label = Go to First Page\npdfjs-last-page-button =\n .title = Go to Last Page\npdfjs-last-page-button-label = Go to Last Page\npdfjs-page-rotate-cw-button =\n .title = Rotate Clockwise\npdfjs-page-rotate-cw-button-label = Rotate Clockwise\npdfjs-page-rotate-ccw-button =\n .title = Rotate Counterclockwise\npdfjs-page-rotate-ccw-button-label = Rotate Counterclockwise\npdfjs-cursor-text-select-tool-button =\n .title = Enable Text Selection Tool\npdfjs-cursor-text-select-tool-button-label = Text Selection Tool\npdfjs-cursor-hand-tool-button =\n .title = Enable Hand Tool\npdfjs-cursor-hand-tool-button-label = Hand Tool\npdfjs-scroll-page-button =\n .title = Use Page Scrolling\npdfjs-scroll-page-button-label = Page Scrolling\npdfjs-scroll-vertical-button =\n .title = Use Vertical Scrolling\npdfjs-scroll-vertical-button-label = Vertical Scrolling\npdfjs-scroll-horizontal-button =\n .title = Use Horizontal Scrolling\npdfjs-scroll-horizontal-button-label = Horizontal Scrolling\npdfjs-scroll-wrapped-button =\n .title = Use Wrapped Scrolling\npdfjs-scroll-wrapped-button-label = Wrapped Scrolling\npdfjs-spread-none-button =\n .title = Do not join page spreads\npdfjs-spread-none-button-label = No Spreads\npdfjs-spread-odd-button =\n .title = Join page spreads starting with odd-numbered pages\npdfjs-spread-odd-button-label = Odd Spreads\npdfjs-spread-even-button =\n .title = Join page spreads starting with even-numbered pages\npdfjs-spread-even-button-label = Even Spreads\npdfjs-document-properties-button =\n .title = Document Properties\u2026\npdfjs-document-properties-button-label = Document Properties\u2026\npdfjs-document-properties-file-name = File name:\npdfjs-document-properties-file-size = File size:\npdfjs-document-properties-size-kb = { NUMBER($kb, maximumSignificantDigits: 3) } KB ({ $b } bytes)\npdfjs-document-properties-size-mb = { NUMBER($mb, maximumSignificantDigits: 3) } MB ({ $b } bytes)\npdfjs-document-properties-title = Title:\npdfjs-document-properties-author = Author:\npdfjs-document-properties-subject = Subject:\npdfjs-document-properties-keywords = Keywords:\npdfjs-document-properties-creation-date = Creation Date:\npdfjs-document-properties-modification-date = Modification Date:\npdfjs-document-properties-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-document-properties-creator = Creator:\npdfjs-document-properties-producer = PDF Producer:\npdfjs-document-properties-version = PDF Version:\npdfjs-document-properties-page-count = Page Count:\npdfjs-document-properties-page-size = Page Size:\npdfjs-document-properties-page-size-unit-inches = in\npdfjs-document-properties-page-size-unit-millimeters = mm\npdfjs-document-properties-page-size-orientation-portrait = portrait\npdfjs-document-properties-page-size-orientation-landscape = landscape\npdfjs-document-properties-page-size-name-a-three = A3\npdfjs-document-properties-page-size-name-a-four = A4\npdfjs-document-properties-page-size-name-letter = Letter\npdfjs-document-properties-page-size-name-legal = Legal\npdfjs-document-properties-page-size-dimension-string = { $width } \xD7 { $height } { $unit } ({ $orientation })\npdfjs-document-properties-page-size-dimension-name-string = { $width } \xD7 { $height } { $unit } ({ $name }, { $orientation })\npdfjs-document-properties-linearized = Fast Web View:\npdfjs-document-properties-linearized-yes = Yes\npdfjs-document-properties-linearized-no = No\npdfjs-document-properties-close-button = Close\npdfjs-print-progress-message = Preparing document for printing\u2026\npdfjs-print-progress-percent = { $progress }%\npdfjs-print-progress-close-button = Cancel\npdfjs-printing-not-supported = Warning: Printing is not fully supported by this browser.\npdfjs-printing-not-ready = Warning: The PDF is not fully loaded for printing.\npdfjs-toggle-sidebar-button =\n .title = Toggle Sidebar\npdfjs-toggle-sidebar-notification-button =\n .title = Toggle Sidebar (document contains outline/attachments/layers)\npdfjs-toggle-sidebar-button-label = Toggle Sidebar\npdfjs-document-outline-button =\n .title = Show Document Outline (double-click to expand/collapse all items)\npdfjs-document-outline-button-label = Document Outline\npdfjs-attachments-button =\n .title = Show Attachments\npdfjs-attachments-button-label = Attachments\npdfjs-layers-button =\n .title = Show Layers (double-click to reset all layers to the default state)\npdfjs-layers-button-label = Layers\npdfjs-thumbs-button =\n .title = Show Thumbnails\npdfjs-thumbs-button-label = Thumbnails\npdfjs-current-outline-item-button =\n .title = Find Current Outline Item\npdfjs-current-outline-item-button-label = Current Outline Item\npdfjs-findbar-button =\n .title = Find in Document\npdfjs-findbar-button-label = Find\npdfjs-additional-layers = Additional Layers\npdfjs-thumb-page-title =\n .title = Page { $page }\npdfjs-thumb-page-canvas =\n .aria-label = Thumbnail of Page { $page }\npdfjs-find-input =\n .title = Find\n .placeholder = Find in document\u2026\npdfjs-find-previous-button =\n .title = Find the previous occurrence of the phrase\npdfjs-find-previous-button-label = Previous\npdfjs-find-next-button =\n .title = Find the next occurrence of the phrase\npdfjs-find-next-button-label = Next\npdfjs-find-highlight-checkbox = Highlight All\npdfjs-find-match-case-checkbox-label = Match Case\npdfjs-find-match-diacritics-checkbox-label = Match Diacritics\npdfjs-find-entire-word-checkbox-label = Whole Words\npdfjs-find-reached-top = Reached top of document, continued from bottom\npdfjs-find-reached-bottom = Reached end of document, continued from top\npdfjs-find-match-count =\n { $total ->\n [one] { $current } of { $total } match\n *[other] { $current } of { $total } matches\n }\npdfjs-find-match-count-limit =\n { $limit ->\n [one] More than { $limit } match\n *[other] More than { $limit } matches\n }\npdfjs-find-not-found = Phrase not found\npdfjs-page-scale-width = Page Width\npdfjs-page-scale-fit = Page Fit\npdfjs-page-scale-auto = Automatic Zoom\npdfjs-page-scale-actual = Actual Size\npdfjs-page-scale-percent = { $scale }%\npdfjs-page-landmark =\n .aria-label = Page { $page }\npdfjs-loading-error = An error occurred while loading the PDF.\npdfjs-invalid-file-error = Invalid or corrupted PDF file.\npdfjs-missing-file-error = Missing PDF file.\npdfjs-unexpected-response-error = Unexpected server response.\npdfjs-rendering-error = An error occurred while rendering the page.\npdfjs-annotation-date-time-string = { DATETIME($dateObj, dateStyle: \"short\", timeStyle: \"medium\") }\npdfjs-text-annotation-type =\n .alt = [{ $type } Annotation]\npdfjs-password-label = Enter the password to open this PDF file.\npdfjs-password-invalid = Invalid password. Please try again.\npdfjs-password-ok-button = OK\npdfjs-password-cancel-button = Cancel\npdfjs-web-fonts-disabled = Web fonts are disabled: unable to use embedded PDF fonts.\npdfjs-editor-free-text-button =\n .title = Text\npdfjs-editor-color-picker-free-text-input =\n .title = Change text color\npdfjs-editor-free-text-button-label = Text\npdfjs-editor-ink-button =\n .title = Draw\npdfjs-editor-color-picker-ink-input =\n .title = Change drawing color\npdfjs-editor-ink-button-label = Draw\npdfjs-editor-stamp-button =\n .title = Add or edit images\npdfjs-editor-stamp-button-label = Add or edit images\npdfjs-editor-highlight-button =\n .title = Highlight\npdfjs-editor-highlight-button-label = Highlight\npdfjs-highlight-floating-button1 =\n .title = Highlight\n .aria-label = Highlight\npdfjs-highlight-floating-button-label = Highlight\npdfjs-comment-floating-button =\n .title = Comment\n .aria-label = Comment\npdfjs-comment-floating-button-label = Comment\npdfjs-editor-comment-button =\n .title = Comment\n .aria-label = Comment\npdfjs-editor-comment-button-label = Comment\npdfjs-editor-signature-button =\n .title = Add signature\npdfjs-editor-signature-button-label = Add signature\npdfjs-editor-highlight-editor =\n .aria-label = Highlight editor\npdfjs-editor-ink-editor =\n .aria-label = Drawing editor\npdfjs-editor-signature-editor1 =\n .aria-description = Signature editor: { $description }\npdfjs-editor-stamp-editor =\n .aria-label = Image editor\npdfjs-editor-remove-ink-button =\n .title = Remove drawing\npdfjs-editor-remove-freetext-button =\n .title = Remove text\npdfjs-editor-remove-stamp-button =\n .title = Remove image\npdfjs-editor-remove-highlight-button =\n .title = Remove highlight\npdfjs-editor-remove-signature-button =\n .title = Remove signature\npdfjs-editor-free-text-color-input = Color\npdfjs-editor-free-text-size-input = Size\npdfjs-editor-ink-color-input = Color\npdfjs-editor-ink-thickness-input = Thickness\npdfjs-editor-ink-opacity-input = Opacity\npdfjs-editor-stamp-add-image-button =\n .title = Add image\npdfjs-editor-stamp-add-image-button-label = Add image\npdfjs-editor-free-highlight-thickness-input = Thickness\npdfjs-editor-free-highlight-thickness-title =\n .title = Change thickness when highlighting items other than text\npdfjs-editor-add-signature-container =\n .aria-label = Signature controls and saved signatures\npdfjs-editor-signature-add-signature-button =\n .title = Add new signature\npdfjs-editor-signature-add-signature-button-label = Add new signature\npdfjs-editor-add-saved-signature-button =\n .title = Saved signature: { $description }\npdfjs-free-text2 =\n .aria-label = Text Editor\n .default-content = Start typing\u2026\npdfjs-editor-comments-sidebar-title =\n { $count ->\n [one] Comment\n *[other] Comments\n }\npdfjs-editor-comments-sidebar-close-button =\n .title = Close the sidebar\n .aria-label = Close the sidebar\npdfjs-editor-comments-sidebar-close-button-label = Close the sidebar\npdfjs-editor-comments-sidebar-no-comments1 = See something noteworthy? Highlight it and leave a comment.\npdfjs-editor-comments-sidebar-no-comments-link = Learn more\npdfjs-editor-alt-text-button =\n .aria-label = Alt text\npdfjs-editor-alt-text-button-label = Alt text\npdfjs-editor-alt-text-edit-button =\n .aria-label = Edit alt text\npdfjs-editor-alt-text-dialog-label = Choose an option\npdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people can\u2019t see the image or when it doesn\u2019t load.\npdfjs-editor-alt-text-add-description-label = Add a description\npdfjs-editor-alt-text-add-description-description = Aim for 1-2 sentences that describe the subject, setting, or actions.\npdfjs-editor-alt-text-mark-decorative-label = Mark as decorative\npdfjs-editor-alt-text-mark-decorative-description = This is used for ornamental images, like borders or watermarks.\npdfjs-editor-alt-text-cancel-button = Cancel\npdfjs-editor-alt-text-save-button = Save\npdfjs-editor-alt-text-decorative-tooltip = Marked as decorative\npdfjs-editor-alt-text-textarea =\n .placeholder = For example, \u201CA young man sits down at a table to eat a meal\u201D\npdfjs-editor-resizer-top-left =\n .aria-label = Top left corner \u2014 resize\npdfjs-editor-resizer-top-middle =\n .aria-label = Top middle \u2014 resize\npdfjs-editor-resizer-top-right =\n .aria-label = Top right corner \u2014 resize\npdfjs-editor-resizer-middle-right =\n .aria-label = Middle right \u2014 resize\npdfjs-editor-resizer-bottom-right =\n .aria-label = Bottom right corner \u2014 resize\npdfjs-editor-resizer-bottom-middle =\n .aria-label = Bottom middle \u2014 resize\npdfjs-editor-resizer-bottom-left =\n .aria-label = Bottom left corner \u2014 resize\npdfjs-editor-resizer-middle-left =\n .aria-label = Middle left \u2014 resize\npdfjs-editor-highlight-colorpicker-label = Highlight color\npdfjs-editor-colorpicker-button =\n .title = Change color\npdfjs-editor-colorpicker-dropdown =\n .aria-label = Color choices\npdfjs-editor-colorpicker-yellow =\n .title = Yellow\npdfjs-editor-colorpicker-green =\n .title = Green\npdfjs-editor-colorpicker-blue =\n .title = Blue\npdfjs-editor-colorpicker-pink =\n .title = Pink\npdfjs-editor-colorpicker-red =\n .title = Red\npdfjs-editor-highlight-show-all-button-label = Show all\npdfjs-editor-highlight-show-all-button =\n .title = Show all\npdfjs-editor-new-alt-text-dialog-edit-label = Edit alt text (image description)\npdfjs-editor-new-alt-text-dialog-add-label = Add alt text (image description)\npdfjs-editor-new-alt-text-textarea =\n .placeholder = Write your description here\u2026\npdfjs-editor-new-alt-text-description = Short description for people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-new-alt-text-disclaimer1 = This alt text was created automatically and may be inaccurate.\npdfjs-editor-new-alt-text-disclaimer-learn-more-url = Learn more\npdfjs-editor-new-alt-text-create-automatically-button-label = Create alt text automatically\npdfjs-editor-new-alt-text-not-now-button = Not now\npdfjs-editor-new-alt-text-error-title = Couldn\u2019t create alt text automatically\npdfjs-editor-new-alt-text-error-description = Please write your own alt text or try again later.\npdfjs-editor-new-alt-text-error-close-button = Close\npdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\n .aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)\npdfjs-editor-new-alt-text-added-button =\n .aria-label = Alt text added\npdfjs-editor-new-alt-text-added-button-label = Alt text added\npdfjs-editor-new-alt-text-missing-button =\n .aria-label = Missing alt text\npdfjs-editor-new-alt-text-missing-button-label = Missing alt text\npdfjs-editor-new-alt-text-to-review-button =\n .aria-label = Review alt text\npdfjs-editor-new-alt-text-to-review-button-label = Review alt text\npdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer = Created automatically: { $generatedAltText }\npdfjs-image-alt-text-settings-button =\n .title = Image alt text settings\npdfjs-image-alt-text-settings-button-label = Image alt text settings\npdfjs-editor-alt-text-settings-dialog-label = Image alt text settings\npdfjs-editor-alt-text-settings-automatic-title = Automatic alt text\npdfjs-editor-alt-text-settings-create-model-button-label = Create alt text automatically\npdfjs-editor-alt-text-settings-create-model-description = Suggests descriptions to help people who can\u2019t see the image or when the image doesn\u2019t load.\npdfjs-editor-alt-text-settings-download-model-label = Alt text AI model ({ $totalSize } MB)\npdfjs-editor-alt-text-settings-ai-model-description = Runs locally on your device so your data stays private. Required for automatic alt text.\npdfjs-editor-alt-text-settings-delete-model-button = Delete\npdfjs-editor-alt-text-settings-download-model-button = Download\npdfjs-editor-alt-text-settings-downloading-model-button = Downloading\u2026\npdfjs-editor-alt-text-settings-editor-title = Alt text editor\npdfjs-editor-alt-text-settings-show-dialog-button-label = Show alt text editor right away when adding an image\npdfjs-editor-alt-text-settings-show-dialog-description = Helps you make sure all your images have alt text.\npdfjs-editor-alt-text-settings-close-button = Close\npdfjs-editor-highlight-added-alert = Highlight added\npdfjs-editor-freetext-added-alert = Text added\npdfjs-editor-ink-added-alert = Drawing added\npdfjs-editor-stamp-added-alert = Image added\npdfjs-editor-signature-added-alert = Signature added\npdfjs-editor-undo-bar-message-highlight = Highlight removed\npdfjs-editor-undo-bar-message-freetext = Text removed\npdfjs-editor-undo-bar-message-ink = Drawing removed\npdfjs-editor-undo-bar-message-stamp = Image removed\npdfjs-editor-undo-bar-message-signature = Signature removed\npdfjs-editor-undo-bar-message-multiple =\n { $count ->\n [one] { $count } annotation removed\n *[other] { $count } annotations removed\n }\npdfjs-editor-undo-bar-undo-button =\n .title = Undo\npdfjs-editor-undo-bar-undo-button-label = Undo\npdfjs-editor-undo-bar-close-button =\n .title = Close\npdfjs-editor-undo-bar-close-button-label = Close\npdfjs-editor-add-signature-dialog-label = This modal allows the user to create a signature to add to a PDF document. The user can edit the name (which also serves as the alt text), and optionally save the signature for repeated use.\npdfjs-editor-add-signature-dialog-title = Add a signature\npdfjs-editor-add-signature-type-button = Type\n .title = Type\npdfjs-editor-add-signature-draw-button = Draw\n .title = Draw\npdfjs-editor-add-signature-image-button = Image\n .title = Image\npdfjs-editor-add-signature-type-input =\n .aria-label = Type your signature\n .placeholder = Type your signature\npdfjs-editor-add-signature-draw-placeholder = Draw your signature\npdfjs-editor-add-signature-draw-thickness-range-label = Thickness\npdfjs-editor-add-signature-draw-thickness-range =\n .title = Drawing thickness: { $thickness }\npdfjs-editor-add-signature-image-placeholder = Drag a file here to upload\npdfjs-editor-add-signature-image-browse-link =\n { PLATFORM() ->\n [macos] Or choose image files\n *[other] Or browse image files\n }\npdfjs-editor-add-signature-description-label = Description (alt text)\npdfjs-editor-add-signature-description-input =\n .title = Description (alt text)\npdfjs-editor-add-signature-description-default-when-drawing = Signature\npdfjs-editor-add-signature-clear-button-label = Clear signature\npdfjs-editor-add-signature-clear-button =\n .title = Clear signature\npdfjs-editor-add-signature-save-checkbox = Save signature\npdfjs-editor-add-signature-save-warning-message = You\u2019ve reached the limit of 5 saved signatures. Remove one to save more.\npdfjs-editor-add-signature-image-upload-error-title = Couldn\u2019t upload image\npdfjs-editor-add-signature-image-upload-error-description = Check your network connection or try another image.\npdfjs-editor-add-signature-image-no-data-error-title = Can\u2019t convert this image into a signature\npdfjs-editor-add-signature-image-no-data-error-description = Please try uploading a different image.\npdfjs-editor-add-signature-error-close-button = Close\npdfjs-editor-add-signature-cancel-button = Cancel\npdfjs-editor-add-signature-add-button = Add\npdfjs-editor-delete-signature-button1 =\n .title = Remove saved signature\npdfjs-editor-delete-signature-button-label1 = Remove saved signature\npdfjs-editor-add-signature-edit-button-label = Edit description\npdfjs-editor-edit-signature-dialog-title = Edit description\npdfjs-editor-edit-signature-update-button = Update\npdfjs-show-comment-button =\n .title = Show comment\npdfjs-editor-edit-comment-popup-button-label = Edit comment\npdfjs-editor-edit-comment-popup-button =\n .title = Edit comment\npdfjs-editor-delete-comment-popup-button-label = Remove comment\npdfjs-editor-delete-comment-popup-button =\n .title = Remove comment\npdfjs-editor-edit-comment-dialog-title-when-editing = Edit comment\npdfjs-editor-edit-comment-dialog-save-button-when-editing = Update\npdfjs-editor-edit-comment-dialog-title-when-adding = Add comment\npdfjs-editor-edit-comment-dialog-save-button-when-adding = Add\npdfjs-editor-edit-comment-dialog-text-input =\n .placeholder = Start typing\u2026\npdfjs-editor-edit-comment-dialog-cancel-button = Cancel\npdfjs-editor-edit-comment-button =\n .title = Edit comment"; + return createBundle(lang, text); + } +} + +;// ./web/generic_scripting.js + +async function docProperties(pdfDocument) { + const url = "", + baseUrl = ""; + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + return { + ...info, + baseURL: baseUrl, + filesize: contentLength || (await pdfDocument.getDownloadInfo()).length, + filename: contentDispositionFilename || getPdfFilenameFromUrl(url), + metadata: metadata?.getRaw(), + authors: metadata?.get("dc:creator"), + numPages: pdfDocument.numPages, + URL: url + }; +} +class GenericScripting { + constructor(sandboxBundleSrc) { + this._ready = new Promise((resolve, reject) => { + const sandbox = import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + sandboxBundleSrc); + sandbox.then(pdfjsSandbox => { + resolve(pdfjsSandbox.QuickJSSandbox()); + }).catch(reject); + }); + } + async createSandbox(data) { + const sandbox = await this._ready; + sandbox.create(data); + } + async dispatchEventInSandbox(event) { + const sandbox = await this._ready; + setTimeout(() => sandbox.dispatchEvent(event), 0); + } + async destroySandbox() { + const sandbox = await this._ready; + sandbox.nukeSandbox(); + } +} + +;// ./web/generic_signature_storage.js + +const KEY_STORAGE = "pdfjs.signature"; +class SignatureStorage { + #eventBus; + #signatures = null; + #signal = null; + constructor(eventBus, signal) { + this.#eventBus = eventBus; + this.#signal = signal; + } + #save() { + localStorage.setItem(KEY_STORAGE, JSON.stringify(Object.fromEntries(this.#signatures))); + } + async getAll() { + if (this.#signal) { + window.addEventListener("storage", ({ + key + }) => { + if (key === KEY_STORAGE) { + this.#signatures = null; + this.#eventBus?.dispatch("storedsignatureschanged", { + source: this + }); + } + }, { + signal: this.#signal + }); + this.#signal = null; + } + if (!this.#signatures) { + this.#signatures = new Map(); + const data = localStorage.getItem(KEY_STORAGE); + if (data) { + for (const [key, value] of Object.entries(JSON.parse(data))) { + this.#signatures.set(key, value); + } + } + } + return this.#signatures; + } + async isFull() { + return (await this.size()) === 5; + } + async size() { + return (await this.getAll()).size; + } + async create(data) { + if (await this.isFull()) { + return null; + } + const uuid = getUuid(); + this.#signatures.set(uuid, data); + this.#save(); + return uuid; + } + async delete(uuid) { + const signatures = await this.getAll(); + if (!signatures.has(uuid)) { + return false; + } + signatures.delete(uuid); + this.#save(); + return true; + } +} + +;// ./web/genericcom.js + + + + + + +function initCom(app) {} +class Preferences extends BasePreferences { + async _writeToStorage(prefObj) { + localStorage.setItem("pdfjs.preferences", JSON.stringify(prefObj)); + } + async _readFromStorage(prefObj) { + return { + prefs: JSON.parse(localStorage.getItem("pdfjs.preferences")) + }; + } +} +class ExternalServices extends BaseExternalServices { + async createL10n() { + return new genericl10n_GenericL10n(AppOptions.get("localeProperties")?.lang); + } + createScripting() { + return new GenericScripting(AppOptions.get("sandboxBundleSrc")); + } + createSignatureStorage(eventBus, signal) { + return new SignatureStorage(eventBus, signal); + } +} +class MLManager { + async isEnabledFor(_name) { + return false; + } + async deleteModel(_service) { + return null; + } + isReady(_name) { + return false; + } + guess(_data) {} + toggleService(_name, _enabled) {} +} + +;// ./web/new_alt_text_manager.js + +class NewAltTextManager { + #boundCancel = this.#cancel.bind(this); + #createAutomaticallyButton; + #currentEditor = null; + #cancelButton; + #descriptionContainer; + #dialog; + #disclaimer; + #downloadModel; + #downloadModelDescription; + #eventBus; + #firstTime = false; + #guessedAltText; + #hasAI = null; + #isEditing = null; + #imagePreview; + #imageData; + #isAILoading = false; + #wasAILoading = false; + #learnMore; + #notNowButton; + #overlayManager; + #textarea; + #title; + #uiManager; + #previousAltText = null; + constructor({ + descriptionContainer, + dialog, + imagePreview, + cancelButton, + disclaimer, + notNowButton, + saveButton, + textarea, + learnMore, + errorCloseButton, + createAutomaticallyButton, + downloadModel, + downloadModelDescription, + title + }, overlayManager, eventBus) { + this.#cancelButton = cancelButton; + this.#createAutomaticallyButton = createAutomaticallyButton; + this.#descriptionContainer = descriptionContainer; + this.#dialog = dialog; + this.#disclaimer = disclaimer; + this.#notNowButton = notNowButton; + this.#imagePreview = imagePreview; + this.#textarea = textarea; + this.#learnMore = learnMore; + this.#title = title; + this.#downloadModel = downloadModel; + this.#downloadModelDescription = downloadModelDescription; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#boundCancel); + notNowButton.addEventListener("click", this.#boundCancel); + saveButton.addEventListener("click", this.#save.bind(this)); + errorCloseButton.addEventListener("click", () => { + this.#toggleError(false); + }); + createAutomaticallyButton.addEventListener("click", async () => { + const checked = createAutomaticallyButton.getAttribute("aria-pressed") !== "true"; + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.ai_generation_check", + data: { + status: checked + } + }); + if (this.#uiManager) { + this.#uiManager.setPreference("enableGuessAltText", checked); + await this.#uiManager.mlManager.toggleService("altText", checked); + } + this.#toggleGuessAltText(checked, false); + }); + textarea.addEventListener("focus", () => { + this.#wasAILoading = this.#isAILoading; + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("blur", () => { + if (!textarea.value) { + this.#toggleLoading(this.#wasAILoading); + } + this.#toggleTitleAndDisclaimer(); + }); + textarea.addEventListener("input", () => { + this.#toggleTitleAndDisclaimer(); + }); + eventBus._on("enableguessalttext", ({ + value + }) => { + this.#toggleGuessAltText(value, false); + }); + this.#overlayManager.register(dialog); + this.#learnMore.addEventListener("click", () => { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.info", + data: { + topic: "alt_text" + } + }); + }); + } + #toggleLoading(value) { + if (!this.#uiManager || this.#isAILoading === value) { + return; + } + this.#isAILoading = value; + this.#descriptionContainer.classList.toggle("loading", value); + } + #toggleError(value) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("error", value); + } + async #toggleGuessAltText(value, isInitial = false) { + if (!this.#uiManager) { + return; + } + this.#dialog.classList.toggle("aiDisabled", !value); + this.#createAutomaticallyButton.setAttribute("aria-pressed", value); + if (value) { + const { + altTextLearnMoreUrl + } = this.#uiManager.mlManager; + if (altTextLearnMoreUrl) { + this.#learnMore.href = altTextLearnMoreUrl; + } + this.#mlGuessAltText(isInitial); + } else { + this.#toggleLoading(false); + this.#isAILoading = false; + this.#toggleTitleAndDisclaimer(); + } + } + #toggleNotNow() { + this.#notNowButton.classList.toggle("hidden", !this.#firstTime); + this.#cancelButton.classList.toggle("hidden", this.#firstTime); + } + #toggleAI(value) { + if (!this.#uiManager || this.#hasAI === value) { + return; + } + this.#hasAI = value; + this.#dialog.classList.toggle("noAi", !value); + this.#toggleTitleAndDisclaimer(); + } + #toggleTitleAndDisclaimer() { + const visible = this.#isAILoading || this.#guessedAltText && this.#guessedAltText === this.#textarea.value; + this.#disclaimer.hidden = !visible; + const isEditing = this.#isAILoading || !!this.#textarea.value; + if (this.#isEditing === isEditing) { + return; + } + this.#isEditing = isEditing; + this.#title.setAttribute("data-l10n-id", isEditing ? "pdfjs-editor-new-alt-text-dialog-edit-label" : "pdfjs-editor-new-alt-text-dialog-add-label"); + } + async #mlGuessAltText(isInitial) { + if (this.#isAILoading) { + return; + } + if (this.#textarea.value) { + return; + } + if (isInitial && this.#previousAltText !== null) { + return; + } + this.#guessedAltText = this.#currentEditor.guessedAltText; + if (this.#previousAltText === null && this.#guessedAltText) { + this.#addAltText(this.#guessedAltText); + return; + } + this.#toggleLoading(true); + this.#toggleTitleAndDisclaimer(); + let hasError = false; + try { + const altText = await this.#currentEditor.mlGuessAltText(this.#imageData, false); + if (altText) { + this.#guessedAltText = altText; + this.#wasAILoading = this.#isAILoading; + if (this.#isAILoading) { + this.#addAltText(altText); + } + } + } catch (e) { + console.error(e); + hasError = true; + } + this.#toggleLoading(false); + this.#toggleTitleAndDisclaimer(); + if (hasError && this.#uiManager) { + this.#toggleError(true); + } + } + #addAltText(altText) { + if (!this.#uiManager || this.#textarea.value) { + return; + } + this.#textarea.value = altText; + this.#toggleTitleAndDisclaimer(); + } + #setProgress() { + this.#downloadModel.classList.toggle("hidden", false); + const callback = async ({ + detail: { + finished, + total, + totalLoaded + } + }) => { + const ONE_MEGA_BYTES = 1e6; + totalLoaded = Math.min(0.99 * total, totalLoaded); + const totalSize = this.#downloadModelDescription.ariaValueMax = Math.round(total / ONE_MEGA_BYTES); + const downloadedSize = this.#downloadModelDescription.ariaValueNow = Math.round(totalLoaded / ONE_MEGA_BYTES); + this.#downloadModelDescription.setAttribute("data-l10n-args", JSON.stringify({ + totalSize, + downloadedSize + })); + if (!finished) { + return; + } + this.#eventBus._off("loadaiengineprogress", callback); + this.#downloadModel.classList.toggle("hidden", true); + this.#toggleAI(true); + if (!this.#uiManager) { + return; + } + const { + mlManager + } = this.#uiManager; + mlManager.toggleService("altText", true); + this.#toggleGuessAltText(await mlManager.isEnabledFor("altText"), true); + }; + this.#eventBus._on("loadaiengineprogress", callback); + } + async editAltText(uiManager, editor, firstTime) { + if (this.#currentEditor || !editor) { + return; + } + if (firstTime && editor.hasAltTextData()) { + editor.altTextFinish(); + return; + } + this.#firstTime = firstTime; + let { + mlManager + } = uiManager; + let hasAI = !!mlManager; + this.#toggleTitleAndDisclaimer(); + if (mlManager && !mlManager.isReady("altText")) { + hasAI = false; + if (mlManager.hasProgress) { + this.#setProgress(); + } else { + mlManager = null; + } + } else { + this.#downloadModel.classList.toggle("hidden", true); + } + const isAltTextEnabledPromise = mlManager?.isEnabledFor("altText"); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + ({ + altText: this.#previousAltText + } = editor.altTextData); + this.#textarea.value = this.#previousAltText ?? ""; + const AI_MAX_IMAGE_DIMENSION = 224; + const MAX_PREVIEW_DIMENSION = 180; + let canvas, width, height; + if (mlManager) { + ({ + canvas, + width, + height, + imageData: this.#imageData + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, true)); + if (hasAI) { + this.#toggleGuessAltText(await isAltTextEnabledPromise, true); + } + } else { + ({ + canvas, + width, + height + } = editor.copyCanvas(AI_MAX_IMAGE_DIMENSION, MAX_PREVIEW_DIMENSION, false)); + } + canvas.setAttribute("role", "presentation"); + const { + style + } = canvas; + style.width = `${width}px`; + style.height = `${height}px`; + this.#imagePreview.append(canvas); + this.#toggleNotNow(); + this.#toggleAI(hasAI); + this.#toggleError(false); + try { + await this.#overlayManager.open(this.#dialog); + } catch (ex) { + this.#close(); + throw ex; + } + } + #cancel() { + this.#currentEditor.altTextData = { + cancel: true + }; + const altText = this.#textarea.value.trim(); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.dismiss", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: "skipped" + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + const canvas = this.#imagePreview.firstChild; + canvas.remove(); + canvas.width = canvas.height = 0; + this.#imageData = null; + this.#toggleLoading(false); + this.#uiManager?.addEditListeners(); + this.#currentEditor.altTextFinish(); + this.#uiManager?.setSelected(this.#currentEditor); + this.#currentEditor = null; + this.#uiManager = null; + } + #extractWords(text) { + return new Set(text.toLowerCase().split(/[^\p{L}\p{N}]+/gu).filter(x => !!x)); + } + #save() { + const altText = this.#textarea.value.trim(); + this.#currentEditor.altTextData = { + altText, + decorative: false + }; + this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText; + if (this.#guessedAltText && this.#guessedAltText !== altText) { + const guessedWords = this.#extractWords(this.#guessedAltText); + const words = this.#extractWords(altText); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.user_edit", + data: { + total_words: guessedWords.size, + words_removed: guessedWords.difference(words).size, + words_added: words.difference(guessedWords).size + } + }); + } + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.image_added", + data: { + alt_text_modal: true, + alt_text_type: altText ? "present" : "empty" + } + }); + this.#currentEditor._reportTelemetry({ + action: "pdfjs.image.alt_text.save", + data: { + alt_text_type: altText ? "present" : "empty", + flow: this.#firstTime ? "image_add" : "alt_text_edit" + } + }); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class ImageAltTextSettings { + #aiModelSettings; + #createModelButton; + #downloadModelButton; + #dialog; + #eventBus; + #mlManager; + #overlayManager; + #showAltTextDialogButton; + constructor({ + dialog, + createModelButton, + aiModelSettings, + learnMore, + closeButton, + deleteModelButton, + downloadModelButton, + showAltTextDialogButton + }, overlayManager, eventBus, mlManager) { + this.#dialog = dialog; + this.#aiModelSettings = aiModelSettings; + this.#createModelButton = createModelButton; + this.#downloadModelButton = downloadModelButton; + this.#showAltTextDialogButton = showAltTextDialogButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#mlManager = mlManager; + const { + altTextLearnMoreUrl + } = mlManager; + if (altTextLearnMoreUrl) { + learnMore.href = altTextLearnMoreUrl; + } + dialog.addEventListener("contextmenu", noContextMenu); + createModelButton.addEventListener("click", async e => { + const checked = this.#togglePref("enableGuessAltText", e); + await mlManager.toggleService("altText", checked); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_ai_generation_check", + data: { + status: checked + } + }); + }); + showAltTextDialogButton.addEventListener("click", e => { + const checked = this.#togglePref("enableNewAltTextWhenAddingImage", e); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_edit_alt_text_check", + data: { + status: checked + } + }); + }); + deleteModelButton.addEventListener("click", this.#delete.bind(this, true)); + downloadModelButton.addEventListener("click", this.#download.bind(this, true)); + closeButton.addEventListener("click", this.#finish.bind(this)); + learnMore.addEventListener("click", () => { + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.info", + data: { + topic: "ai_generation" + } + }); + }); + eventBus._on("enablealttextmodeldownload", ({ + value + }) => { + if (value) { + this.#download(false); + } else { + this.#delete(false); + } + }); + this.#overlayManager.register(dialog); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + async #download(isFromUI = false) { + if (isFromUI) { + this.#downloadModelButton.disabled = true; + const span = this.#downloadModelButton.firstChild; + span.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-settings-downloading-model-button"); + await this.#mlManager.downloadModel("altText"); + span.setAttribute("data-l10n-id", "pdfjs-editor-alt-text-settings-download-model-button"); + this.#createModelButton.disabled = false; + this.#setPref("enableGuessAltText", true); + this.#mlManager.toggleService("altText", true); + this.#setPref("enableAltTextModelDownload", true); + this.#downloadModelButton.disabled = false; + } + this.#aiModelSettings.classList.toggle("download", false); + this.#createModelButton.setAttribute("aria-pressed", true); + } + async #delete(isFromUI = false) { + if (isFromUI) { + await this.#mlManager.deleteModel("altText"); + this.#setPref("enableGuessAltText", false); + this.#setPref("enableAltTextModelDownload", false); + } + this.#aiModelSettings.classList.toggle("download", true); + this.#createModelButton.disabled = true; + this.#createModelButton.setAttribute("aria-pressed", false); + } + async open({ + enableGuessAltText, + enableNewAltTextWhenAddingImage + }) { + const { + enableAltTextModelDownload + } = this.#mlManager; + this.#createModelButton.disabled = !enableAltTextModelDownload; + this.#createModelButton.setAttribute("aria-pressed", enableAltTextModelDownload && enableGuessAltText); + this.#showAltTextDialogButton.setAttribute("aria-pressed", enableNewAltTextWhenAddingImage); + this.#aiModelSettings.classList.toggle("download", !enableAltTextModelDownload); + await this.#overlayManager.open(this.#dialog); + this.#reportTelemetry({ + type: "stamp", + action: "pdfjs.image.alt_text.settings_displayed" + }); + } + #togglePref(name, { + target + }) { + const checked = target.getAttribute("aria-pressed") !== "true"; + this.#setPref(name, checked); + target.setAttribute("aria-pressed", checked); + return checked; + } + #setPref(name, value) { + this.#eventBus.dispatch("setpreference", { + source: this, + name, + value + }); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } +} + +;// ./web/alt_text_manager.js + +class AltTextManager { + #clickAC = null; + #currentEditor = null; + #cancelButton; + #dialog; + #eventBus; + #hasUsedPointer = false; + #optionDescription; + #optionDecorative; + #overlayManager; + #saveButton; + #textarea; + #uiManager; + #previousAltText = null; + #resizeAC = null; + #svgElement = null; + #rectElement = null; + #container; + #telemetryData = null; + constructor({ + dialog, + optionDescription, + optionDecorative, + textarea, + cancelButton, + saveButton + }, container, overlayManager, eventBus) { + this.#dialog = dialog; + this.#optionDescription = optionDescription; + this.#optionDecorative = optionDecorative; + this.#textarea = textarea; + this.#cancelButton = cancelButton; + this.#saveButton = saveButton; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#container = container; + const onUpdateUIState = this.#updateUIState.bind(this); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", event => { + if (event.target !== this.#textarea) { + event.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#finish.bind(this)); + saveButton.addEventListener("click", this.#save.bind(this)); + optionDescription.addEventListener("change", onUpdateUIState); + optionDecorative.addEventListener("change", onUpdateUIState); + this.#overlayManager.register(dialog); + } + #createSVGElement() { + if (this.#svgElement) { + return; + } + const svgFactory = new DOMSVGFactory(); + const svg = this.#svgElement = svgFactory.createElement("svg"); + svg.setAttribute("width", "0"); + svg.setAttribute("height", "0"); + const defs = svgFactory.createElement("defs"); + svg.append(defs); + const mask = svgFactory.createElement("mask"); + defs.append(mask); + mask.setAttribute("id", "alttext-manager-mask"); + mask.setAttribute("maskContentUnits", "objectBoundingBox"); + let rect = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "white"); + rect.setAttribute("width", "1"); + rect.setAttribute("height", "1"); + rect.setAttribute("x", "0"); + rect.setAttribute("y", "0"); + rect = this.#rectElement = svgFactory.createElement("rect"); + mask.append(rect); + rect.setAttribute("fill", "black"); + this.#dialog.append(svg); + } + async editAltText(uiManager, editor) { + if (this.#currentEditor || !editor) { + return; + } + this.#createSVGElement(); + this.#hasUsedPointer = false; + this.#clickAC = new AbortController(); + const clickOpts = { + signal: this.#clickAC.signal + }, + onClick = this.#onClick.bind(this); + for (const element of [this.#optionDescription, this.#optionDecorative, this.#textarea, this.#saveButton, this.#cancelButton]) { + element.addEventListener("click", onClick, clickOpts); + } + const { + altText, + decorative + } = editor.altTextData; + if (decorative === true) { + this.#optionDecorative.checked = true; + this.#optionDescription.checked = false; + } else { + this.#optionDecorative.checked = false; + this.#optionDescription.checked = true; + } + this.#previousAltText = this.#textarea.value = altText?.trim() || ""; + this.#updateUIState(); + this.#currentEditor = editor; + this.#uiManager = uiManager; + this.#uiManager.removeEditListeners(); + this.#resizeAC = new AbortController(); + this.#eventBus._on("resize", this.#setPosition.bind(this), { + signal: this.#resizeAC.signal + }); + try { + await this.#overlayManager.open(this.#dialog); + this.#setPosition(); + } catch (ex) { + this.#close(); + throw ex; + } + } + #setPosition() { + if (!this.#currentEditor) { + return; + } + const dialog = this.#dialog; + const { + style + } = dialog; + const { + x: containerX, + y: containerY, + width: containerW, + height: containerH + } = this.#container.getBoundingClientRect(); + const { + innerWidth: windowW, + innerHeight: windowH + } = window; + const { + width: dialogW, + height: dialogH + } = dialog.getBoundingClientRect(); + const { + x, + y, + width, + height + } = this.#currentEditor.getClientDimensions(); + const MARGIN = 10; + const isLTR = this.#uiManager.direction === "ltr"; + const xs = Math.max(x, containerX); + const xe = Math.min(x + width, containerX + containerW); + const ys = Math.max(y, containerY); + const ye = Math.min(y + height, containerY + containerH); + this.#rectElement.setAttribute("width", `${(xe - xs) / windowW}`); + this.#rectElement.setAttribute("height", `${(ye - ys) / windowH}`); + this.#rectElement.setAttribute("x", `${xs / windowW}`); + this.#rectElement.setAttribute("y", `${ys / windowH}`); + let left = null; + let top = Math.max(y, 0); + top += Math.min(windowH - (top + dialogH), 0); + if (isLTR) { + if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } + } else if (x > dialogW + MARGIN) { + left = x - dialogW - MARGIN; + } else if (x + width + MARGIN + dialogW < windowW) { + left = x + width + MARGIN; + } + if (left === null) { + top = null; + left = Math.max(x, 0); + left += Math.min(windowW - (left + dialogW), 0); + if (y > dialogH + MARGIN) { + top = y - dialogH - MARGIN; + } else if (y + height + MARGIN + dialogH < windowH) { + top = y + height + MARGIN; + } + } + if (top !== null) { + dialog.classList.add("positioned"); + if (isLTR) { + style.left = `${left}px`; + } else { + style.right = `${windowW - left - dialogW}px`; + } + style.top = `${top}px`; + } else { + dialog.classList.remove("positioned"); + style.left = ""; + style.top = ""; + } + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#currentEditor._reportTelemetry(this.#telemetryData || { + action: "alt_text_cancel", + alt_text_keyboard: !this.#hasUsedPointer + }); + this.#telemetryData = null; + this.#removeOnClickListeners(); + this.#uiManager?.addEditListeners(); + this.#resizeAC?.abort(); + this.#resizeAC = null; + this.#currentEditor.altTextFinish(); + this.#currentEditor = null; + this.#uiManager = null; + } + #updateUIState() { + this.#textarea.disabled = this.#optionDecorative.checked; + } + #save() { + const altText = this.#textarea.value.trim(); + const decorative = this.#optionDecorative.checked; + this.#currentEditor.altTextData = { + altText, + decorative + }; + this.#telemetryData = { + action: "alt_text_save", + alt_text_description: !!altText, + alt_text_edit: !!this.#previousAltText && this.#previousAltText !== altText, + alt_text_decorative: decorative, + alt_text_keyboard: !this.#hasUsedPointer + }; + this.#finish(); + } + #onClick(evt) { + if (evt.detail === 0) { + return; + } + this.#hasUsedPointer = true; + this.#removeOnClickListeners(); + } + #removeOnClickListeners() { + this.#clickAC?.abort(); + this.#clickAC = null; + } + destroy() { + this.#uiManager = null; + this.#finish(); + this.#svgElement?.remove(); + this.#svgElement = this.#rectElement = null; + } +} + +;// ./web/annotation_editor_params.js + +class AnnotationEditorParams { + constructor(options, eventBus) { + this.eventBus = eventBus; + this.#bindListeners(options); + } + #bindListeners({ + editorFreeTextFontSize, + editorFreeTextColor, + editorInkColor, + editorInkThickness, + editorInkOpacity, + editorStampAddImage, + editorFreeHighlightThickness, + editorHighlightShowAll, + editorSignatureAddSignature + }) { + const { + eventBus + } = this; + const dispatchEvent = (typeStr, value) => { + eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType[typeStr], + value + }); + }; + editorFreeTextFontSize.addEventListener("input", function () { + dispatchEvent("FREETEXT_SIZE", this.valueAsNumber); + }); + editorFreeTextColor.addEventListener("input", function () { + dispatchEvent("FREETEXT_COLOR", this.value); + }); + editorInkColor.addEventListener("input", function () { + dispatchEvent("INK_COLOR", this.value); + }); + editorInkThickness.addEventListener("input", function () { + dispatchEvent("INK_THICKNESS", this.valueAsNumber); + }); + editorInkOpacity.addEventListener("input", function () { + dispatchEvent("INK_OPACITY", this.valueAsNumber); + }); + editorStampAddImage.addEventListener("click", () => { + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data: { + action: "pdfjs.image.add_image_click" + } + } + }); + dispatchEvent("CREATE"); + }); + editorFreeHighlightThickness.addEventListener("input", function () { + dispatchEvent("HIGHLIGHT_THICKNESS", this.valueAsNumber); + }); + editorHighlightShowAll.addEventListener("click", function () { + const checked = this.getAttribute("aria-pressed") === "true"; + this.setAttribute("aria-pressed", !checked); + dispatchEvent("HIGHLIGHT_SHOW_ALL", !checked); + }); + editorSignatureAddSignature.addEventListener("click", () => { + dispatchEvent("CREATE"); + }); + eventBus._on("annotationeditorparamschanged", evt => { + for (const [type, value] of evt.details) { + switch (type) { + case AnnotationEditorParamsType.FREETEXT_SIZE: + editorFreeTextFontSize.value = value; + break; + case AnnotationEditorParamsType.FREETEXT_COLOR: + editorFreeTextColor.value = value; + break; + case AnnotationEditorParamsType.INK_COLOR: + editorInkColor.value = value; + break; + case AnnotationEditorParamsType.INK_THICKNESS: + editorInkThickness.value = value; + break; + case AnnotationEditorParamsType.INK_OPACITY: + editorInkOpacity.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_COLOR: + eventBus.dispatch("mainhighlightcolorpickerupdatecolor", { + source: this, + value + }); + break; + case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS: + editorFreeHighlightThickness.value = value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_FREE: + editorFreeHighlightThickness.disabled = !value; + break; + case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL: + editorHighlightShowAll.setAttribute("aria-pressed", value); + break; + } + } + }); + } +} + +;// ./web/caret_browsing.js +const PRECISION = 1e-1; +class CaretBrowsingMode { + #mainContainer; + #toolBarHeight = 0; + #viewerContainer; + constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) { + this.#mainContainer = mainContainer; + this.#viewerContainer = viewerContainer; + if (!toolbarContainer) { + return; + } + this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height; + const toolbarObserver = new ResizeObserver(entries => { + for (const entry of entries) { + if (entry.target === toolbarContainer) { + this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize); + break; + } + } + }); + toolbarObserver.observe(toolbarContainer); + abortSignal.addEventListener("abort", () => toolbarObserver.disconnect(), { + once: true + }); + } + #isOnSameLine(rect1, rect2) { + const top1 = rect1.y; + const bot1 = rect1.bottom; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.bottom; + const mid2 = rect2.y + rect2.height / 2; + return top1 <= mid2 && mid2 <= bot1 || top2 <= mid1 && mid1 <= bot2; + } + #isUnderOver(rect, x, y, isUp) { + const midY = rect.y + rect.height / 2; + return (isUp ? y >= midY : y <= midY) && rect.x - PRECISION <= x && x <= rect.right + PRECISION; + } + #isVisible(rect) { + return rect.top >= this.#toolBarHeight && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth); + } + #getCaretPosition(selection, isUp) { + const { + focusNode, + focusOffset + } = selection; + const range = document.createRange(); + range.setStart(focusNode, focusOffset); + range.setEnd(focusNode, focusOffset); + const rect = range.getBoundingClientRect(); + return [rect.x, isUp ? rect.top : rect.bottom]; + } + static #caretPositionFromPoint(x, y) { + if (!document.caretPositionFromPoint) { + const { + startContainer: offsetNode, + startOffset: offset + } = document.caretRangeFromPoint(x, y); + return { + offsetNode, + offset + }; + } + return document.caretPositionFromPoint(x, y); + } + #setCaretPositionHelper(selection, caretX, select, element, rect) { + rect ||= element.getBoundingClientRect(); + if (caretX <= rect.x + PRECISION) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (rect.right - PRECISION <= caretX) { + const { + lastChild + } = element; + if (select) { + selection.extend(lastChild, lastChild.length); + } else { + selection.setPosition(lastChild, lastChild.length); + } + return; + } + const midY = rect.y + rect.height / 2; + let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + let parentElement = caretPosition.offsetNode?.parentElement; + if (parentElement && parentElement !== element) { + const elementsAtPoint = document.elementsFromPoint(caretX, midY); + const savedVisibilities = []; + for (const el of elementsAtPoint) { + if (el === element) { + break; + } + const { + style + } = el; + savedVisibilities.push([el, style.visibility]); + style.visibility = "hidden"; + } + caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY); + parentElement = caretPosition.offsetNode?.parentElement; + for (const [el, visibility] of savedVisibilities) { + el.style.visibility = visibility; + } + } + if (parentElement !== element) { + if (select) { + selection.extend(element.firstChild, 0); + } else { + selection.setPosition(element.firstChild, 0); + } + return; + } + if (select) { + selection.extend(caretPosition.offsetNode, caretPosition.offset); + } else { + selection.setPosition(caretPosition.offsetNode, caretPosition.offset); + } + } + #setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX) { + if (this.#isVisible(newLineElementRect)) { + this.#setCaretPositionHelper(selection, caretX, select, newLineElement, newLineElementRect); + return; + } + this.#mainContainer.addEventListener("scrollend", this.#setCaretPositionHelper.bind(this, selection, caretX, select, newLineElement, null), { + once: true + }); + newLineElement.scrollIntoView(); + } + #getNodeOnNextPage(textLayer, isUp) { + while (true) { + const page = textLayer.closest(".page"); + const pageNumber = parseInt(page.getAttribute("data-page-number")); + const nextPage = isUp ? pageNumber - 1 : pageNumber + 1; + textLayer = this.#viewerContainer.querySelector(`.page[data-page-number="${nextPage}"] .textLayer`); + if (!textLayer) { + return null; + } + const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT); + const node = isUp ? walker.lastChild() : walker.firstChild(); + if (node) { + return node; + } + } + } + moveCaret(isUp, select) { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + return; + } + const { + focusNode + } = selection; + const focusElement = focusNode.nodeType !== Node.ELEMENT_NODE ? focusNode.parentElement : focusNode; + const root = focusElement.closest(".textLayer"); + if (!root) { + return; + } + const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT); + walker.currentNode = focusNode; + const focusRect = focusElement.getBoundingClientRect(); + let newLineElement = null; + const nodeIterator = (isUp ? walker.previousSibling : walker.nextSibling).bind(walker); + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) { + newLineElement = element; + break; + } + } + if (!newLineElement) { + const node = this.#getNodeOnNextPage(root, isUp); + if (!node) { + return; + } + if (select) { + const lastNode = (isUp ? walker.firstChild() : walker.lastChild()) || focusNode; + selection.extend(lastNode, isUp ? 0 : lastNode.length); + const range = document.createRange(); + range.setStart(node, isUp ? node.length : 0); + range.setEnd(node, isUp ? node.length : 0); + selection.addRange(range); + return; + } + const [caretX] = this.#getCaretPosition(selection, isUp); + const { + parentElement + } = node; + this.#setCaretPosition(select, selection, parentElement, parentElement.getBoundingClientRect(), caretX); + return; + } + const [caretX, caretY] = this.#getCaretPosition(selection, isUp); + const newLineElementRect = newLineElement.getBoundingClientRect(); + if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + return; + } + while (nodeIterator()) { + const element = walker.currentNode.parentElement; + const elementRect = element.getBoundingClientRect(); + if (!this.#isOnSameLine(newLineElementRect, elementRect)) { + break; + } + if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) { + this.#setCaretPosition(select, selection, element, elementRect, caretX); + return; + } + } + this.#setCaretPosition(select, selection, newLineElement, newLineElementRect, caretX); + } +} + +;// ./web/comment_manager.js + + +class CommentManager { + #dialog; + #popup; + #sidebar; + static #hasForcedColors = null; + constructor(commentDialog, sidebar, eventBus, linkService, overlayManager, ltr, hasForcedColors) { + const dateFormat = new Intl.DateTimeFormat(undefined, { + dateStyle: "long" + }); + this.dialogElement = commentDialog.dialog; + this.#dialog = new CommentDialog(commentDialog, overlayManager, eventBus, ltr); + this.#popup = new CommentPopup(eventBus, dateFormat, ltr, this.dialogElement); + this.#sidebar = new CommentSidebar(sidebar, eventBus, linkService, this.#popup, dateFormat, ltr); + this.#popup.sidebar = this.#sidebar; + CommentManager.#hasForcedColors = hasForcedColors; + } + setSidebarUiManager(uiManager) { + this.#sidebar.setUIManager(uiManager); + } + showSidebar(annotations) { + this.#sidebar.show(annotations); + } + hideSidebar() { + this.#sidebar.hide(); + } + removeComments(ids) { + this.#sidebar.removeComments(ids); + } + selectComment(id) { + this.#sidebar.selectComment(null, id); + } + addComment(annotation) { + this.#sidebar.addComment(annotation); + } + updateComment(annotation) { + this.#sidebar.updateComment(annotation); + } + toggleCommentPopup(editor, isSelected, visibility, isEditable) { + if (isSelected) { + this.selectComment(editor.uid); + } + this.#popup.toggle(editor, isSelected, visibility, isEditable); + } + destroyPopup() { + this.#popup.destroy(); + } + updatePopupColor(editor) { + this.#popup.updateColor(editor); + } + showDialog(uiManager, editor, posX, posY, options) { + return this.#dialog.open(uiManager, editor, posX, posY, options); + } + makeCommentColor(color, opacity) { + return CommentManager._makeCommentColor(color, opacity); + } + static _makeCommentColor(color, opacity) { + return this.#hasForcedColors ? null : findContrastColor(applyOpacity(...color, opacity ?? 1), CSSConstants.commentForegroundColor); + } + destroy() { + this.#dialog.destroy(); + this.#sidebar.hide(); + this.#popup.destroy(); + } +} +class CommentSidebar { + #annotations = null; + #eventBus; + #boundCommentClick = this.#commentClick.bind(this); + #boundCommentKeydown = this.#commentKeydown.bind(this); + #sidebar; + #closeButton; + #commentsList; + #commentCount; + #dateFormat; + #sidebarTitle; + #learnMoreUrl; + #linkService; + #popup; + #elementsToAnnotations = null; + #idsToElements = null; + #uiManager = null; + #minWidth = 0; + #maxWidth = 0; + #initialWidth = 0; + #width = 0; + #ltr; + constructor({ + learnMoreUrl, + sidebar, + sidebarResizer, + commentsList, + commentCount, + sidebarTitle, + closeButton, + commentToolbarButton + }, eventBus, linkService, popup, dateFormat, ltr) { + this.#sidebar = sidebar; + this.#sidebarTitle = sidebarTitle; + this.#commentsList = commentsList; + this.#commentCount = commentCount; + this.#learnMoreUrl = learnMoreUrl; + this.#linkService = linkService; + this.#closeButton = closeButton; + this.#popup = popup; + this.#dateFormat = dateFormat; + this.#ltr = ltr; + this.#eventBus = eventBus; + const style = window.getComputedStyle(sidebar); + this.#minWidth = parseFloat(style.getPropertyValue("--sidebar-min-width")); + this.#maxWidth = parseFloat(style.getPropertyValue("--sidebar-max-width")); + this.#initialWidth = this.#width = parseFloat(style.getPropertyValue("--sidebar-width")); + this.#makeSidebarResizable(sidebarResizer); + closeButton.addEventListener("click", () => { + eventBus.dispatch("switchannotationeditormode", { + source: this, + mode: AnnotationEditorType.NONE + }); + }); + const keyDownCallback = e => { + if (e.key === "ArrowDown" || e.key === "Home" || e.key === "F6") { + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + } else if (e.key === "ArrowUp" || e.key === "End") { + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + } + }; + commentToolbarButton.addEventListener("keydown", keyDownCallback); + sidebar.addEventListener("keydown", keyDownCallback); + this.#sidebar.hidden = true; + } + #makeSidebarResizable(resizer) { + let pointerMoveAC; + const cancelResize = () => { + this.#width = MathClamp(this.#width, this.#minWidth, this.#maxWidth); + this.#sidebar.classList.remove("resizing"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + resizer.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelResize(); + return; + } + const { + clientX + } = e; + stopEvent(e); + let prevX = clientX; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const sign = this.#ltr ? -1 : 1; + const sidebar = this.#sidebar; + const sidebarStyle = sidebar.style; + sidebar.classList.add("resizing"); + const parentStyle = sidebar.parentElement.style; + parentStyle.minWidth = 0; + window.addEventListener("contextmenu", noContextMenu, { + signal + }); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + stopEvent(ev); + const { + clientX: x + } = ev; + const newWidth = this.#width += sign * (x - prevX); + prevX = x; + if (newWidth > this.#maxWidth || newWidth < this.#minWidth) { + return; + } + sidebarStyle.width = `${newWidth.toFixed(3)}px`; + parentStyle.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`; + }, { + signal, + capture: true + }); + window.addEventListener("blur", cancelResize, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelResize(); + stopEvent(ev); + } + }, { + signal + }); + }); + } + setUIManager(uiManager) { + this.#uiManager = uiManager; + } + show(annotations) { + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements = new Map(); + this.#annotations = annotations; + annotations.sort(this.#sortComments.bind(this)); + if (annotations.length !== 0) { + const fragment = document.createDocumentFragment(); + for (const annotation of annotations) { + fragment.append(this.#createCommentElement(annotation)); + } + this.#setCommentsCount(fragment); + this.#commentsList.append(fragment); + } else { + this.#setCommentsCount(); + } + this.#sidebar.hidden = false; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "commentSidebar", + data: { + numberOfAnnotations: annotations.length + } + } + }); + } + hide() { + this.#sidebar.hidden = true; + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = null; + this.#idsToElements = null; + this.#annotations = null; + } + removeComments(ids) { + if (ids.length === 0 || !this.#idsToElements) { + return; + } + if (new Set(this.#idsToElements.keys()).difference(new Set(ids)).size === 0) { + this.#removeAll(); + return; + } + for (const id of ids) { + this.#removeComment(id); + } + } + focusComment(id) { + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + this.#sidebar.scrollTop = element.offsetTop - this.#sidebar.offsetTop; + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } + } + updateComment(annotation) { + if (!this.#idsToElements) { + return; + } + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + popupRef + } = annotation; + if (!popupRef || !richText && !contentsObj?.str) { + this.#removeComment(id); + } + const element = this.#idsToElements.get(id); + if (!element) { + return; + } + const prevAnnotation = this.#elementsToAnnotations.get(element); + let index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, prevAnnotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#setDate(element.firstChild, modificationDate || creationDate); + this.#setText(element.lastChild, richText, contentsObj); + this.#annotations.splice(index, 1); + index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(element); + } else { + this.#commentsList.insertBefore(element, this.#commentsList.children[index]); + } + } + #removeComment(id) { + const element = this.#idsToElements?.get(id); + if (!element) { + return; + } + const annotation = this.#elementsToAnnotations.get(element); + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + if (index >= this.#annotations.length) { + return; + } + this.#annotations.splice(index, 1); + element.remove(); + this.#idsToElements.delete(id); + this.#setCommentsCount(); + } + #removeAll() { + this.#commentsList.replaceChildren(); + this.#elementsToAnnotations = new WeakMap(); + this.#idsToElements.clear(); + this.#annotations.length = 0; + this.#setCommentsCount(); + } + selectComment(element, id = null) { + if (!this.#idsToElements) { + return; + } + const hasNoElement = !element; + element ||= this.#idsToElements.get(id); + for (const el of this.#commentsList.children) { + el.classList.toggle("selected", el === element); + } + if (hasNoElement) { + element?.scrollIntoView({ + behavior: "instant", + block: "center" + }); + } + } + addComment(annotation) { + if (this.#idsToElements?.has(annotation.id)) { + return; + } + const { + popupRef, + contentsObj + } = annotation; + if (!popupRef || !contentsObj?.str) { + return; + } + const commentItem = this.#createCommentElement(annotation); + if (this.#annotations.length === 0) { + this.#commentsList.replaceChildren(commentItem); + this.#annotations.push(annotation); + this.#setCommentsCount(); + return; + } + const index = binarySearchFirstItem(this.#annotations, a => this.#sortComments(a, annotation) >= 0); + this.#annotations.splice(index, 0, annotation); + if (index >= this.#commentsList.children.length) { + this.#commentsList.append(commentItem); + } else { + this.#commentsList.insertBefore(commentItem, this.#commentsList.children[index]); + } + this.#setCommentsCount(); + } + #setCommentsCount(container = this.#commentsList) { + const count = this.#idsToElements.size; + this.#sidebarTitle.setAttribute("data-l10n-args", JSON.stringify({ + count + })); + this.#commentCount.textContent = count; + if (count === 0) { + container.append(this.#createZeroCommentElement()); + } + } + #createZeroCommentElement() { + const commentItem = document.createElement("li"); + commentItem.classList.add("sidebarComment", "noComments"); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + textDiv.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments1"); + commentItem.append(textDiv); + if (this.#learnMoreUrl) { + const a = document.createElement("a"); + a.setAttribute("data-l10n-id", "pdfjs-editor-comments-sidebar-no-comments-link"); + a.href = this.#learnMoreUrl; + a.target = "_blank"; + a.rel = "noopener noreferrer"; + commentItem.append(a); + } + return commentItem; + } + #setDate(element, date) { + date = PDFDateString.toDateObject(date); + element.dateTime = date.toISOString(); + element.textContent = this.#dateFormat.format(date); + } + #setText(element, richText, contentsObj) { + element.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, element); + } + #createCommentElement(annotation) { + const { + id, + creationDate, + modificationDate, + richText, + contentsObj, + color, + opacity + } = annotation; + const commentItem = document.createElement("li"); + commentItem.role = "button"; + commentItem.className = "sidebarComment"; + commentItem.tabIndex = -1; + commentItem.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + const dateDiv = document.createElement("time"); + this.#setDate(dateDiv, modificationDate || creationDate); + const textDiv = document.createElement("div"); + textDiv.className = "sidebarCommentText"; + this.#setText(textDiv, richText, contentsObj); + commentItem.append(dateDiv, textDiv); + commentItem.addEventListener("click", this.#boundCommentClick); + commentItem.addEventListener("keydown", this.#boundCommentKeydown); + this.#elementsToAnnotations.set(commentItem, annotation); + this.#idsToElements.set(id, commentItem); + return commentItem; + } + async #commentClick({ + currentTarget + }) { + if (currentTarget.classList.contains("selected")) { + currentTarget.classList.remove("selected"); + this.#popup._hide(); + return; + } + const annotation = this.#elementsToAnnotations.get(currentTarget); + if (!annotation) { + return; + } + this.#popup._hide(); + const { + id, + pageIndex, + rect + } = annotation; + const pageNumber = pageIndex + 1; + const pageVisiblePromise = this.#uiManager?.waitForEditorsRendered(pageNumber); + this.#linkService?.goToXY(pageNumber, rect[0], rect[3], { + center: "both" + }); + this.selectComment(currentTarget); + await pageVisiblePromise; + this.#uiManager?.selectComment(pageIndex, id); + } + #commentKeydown(e) { + const { + key, + currentTarget + } = e; + switch (key) { + case "ArrowDown": + (currentTarget.nextElementSibling || this.#commentsList.firstElementChild).focus(); + stopEvent(e); + break; + case "ArrowUp": + (currentTarget.previousElementSibling || this.#commentsList.lastElementChild).focus(); + stopEvent(e); + break; + case "Home": + this.#commentsList.firstElementChild.focus(); + stopEvent(e); + break; + case "End": + this.#commentsList.lastElementChild.focus(); + stopEvent(e); + break; + case "Enter": + case " ": + this.#commentClick(e); + stopEvent(e); + break; + case "ShiftTab": + this.#closeButton.focus(); + stopEvent(e); + break; + } + } + #sortComments(a, b) { + const dateA = PDFDateString.toDateObject(a.modificationDate || a.creationDate); + const dateB = PDFDateString.toDateObject(b.modificationDate || b.creationDate); + if (dateA !== dateB) { + if (dateA !== null && dateB !== null) { + return dateB - dateA; + } + return dateA !== null ? -1 : 1; + } + if (a.pageIndex !== b.pageIndex) { + return a.pageIndex - b.pageIndex; + } + if (a.rect[3] !== b.rect[3]) { + return b.rect[3] - a.rect[3]; + } + if (a.rect[0] !== b.rect[0]) { + return a.rect[0] - b.rect[0]; + } + if (a.rect[1] !== b.rect[1]) { + return b.rect[1] - a.rect[1]; + } + if (a.rect[2] !== b.rect[2]) { + return a.rect[2] - b.rect[2]; + } + return a.id.localeCompare(b.id); + } +} +class CommentDialog { + #dialog; + #editor; + #overlayManager; + #previousText = ""; + #commentText = ""; + #textInput; + #title; + #saveButton; + #uiManager; + #prevDragX = 0; + #prevDragY = 0; + #dialogX = 0; + #dialogY = 0; + #isLTR; + #eventBus; + constructor({ + dialog, + toolbar, + title, + textInput, + cancelButton, + saveButton + }, overlayManager, eventBus, ltr) { + this.#dialog = dialog; + this.#textInput = textInput; + this.#overlayManager = overlayManager; + this.#eventBus = eventBus; + this.#saveButton = saveButton; + this.#title = title; + this.#isLTR = ltr; + const finishBound = this.#finish.bind(this); + dialog.addEventListener("close", finishBound); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#textInput) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", finishBound); + saveButton.addEventListener("click", this.#save.bind(this)); + textInput.addEventListener("input", () => { + saveButton.disabled = textInput.value === this.#previousText; + }); + let pointerMoveAC; + const cancelDrag = () => { + dialog.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + toolbar.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; + } + const { + clientX, + clientY + } = e; + stopEvent(e); + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + const { + innerHeight, + innerWidth + } = window; + dialog.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#dialogX + (x - this.#prevDragX) / innerWidth, this.#dialogY + (y - this.#prevDragY) / innerHeight); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + overlayManager.register(dialog); + } + async open(uiManager, editor, posX, posY, options) { + if (editor) { + this.#uiManager = uiManager; + this.#editor = editor; + } + const { + contentsObj: { + str + }, + color, + opacity + } = editor.getData(); + const { + style: dialogStyle + } = this.#dialog; + if (color) { + dialogStyle.backgroundColor = CommentManager._makeCommentColor(color, opacity); + dialogStyle.borderColor = Util.makeHexColor(...color); + } else { + dialogStyle.backgroundColor = dialogStyle.borderColor = ""; + } + this.#commentText = str || ""; + const textInput = this.#textInput; + textInput.value = this.#previousText = this.#commentText; + if (str) { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-editing"); + this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-editing"); + } else { + this.#title.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-title-when-adding"); + this.#saveButton.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-dialog-save-button-when-adding"); + } + if (options?.height) { + textInput.style.height = `${options.height}px`; + } + this.#uiManager?.removeEditListeners(); + this.#saveButton.disabled = true; + const parentDimensions = options?.parentDimensions; + const { + innerHeight, + innerWidth + } = window; + if (editor.hasDefaultPopupPosition()) { + const { + dialogWidth, + dialogHeight + } = this._dialogDimensions; + if (parentDimensions) { + if (this.#isLTR && posX + dialogWidth > Math.min(parentDimensions.x + parentDimensions.width, innerWidth)) { + const buttonWidth = this.#editor.commentButtonWidth; + posX -= dialogWidth - buttonWidth * parentDimensions.width; + } else if (!this.#isLTR) { + const buttonWidth = this.#editor.commentButtonWidth * parentDimensions.width; + if (posX - dialogWidth < Math.max(0, parentDimensions.x)) { + posX = Math.max(0, posX); + } else { + posX -= dialogWidth - buttonWidth; + } + } + } + const height = Math.max(dialogHeight, options?.height || 0); + if (posY + height > innerHeight) { + posY = innerHeight - height; + } + if (posY < 0) { + posY = 0; + } + } + posX = MathClamp(posX / innerWidth, 0, 1); + posY = MathClamp(posY / innerHeight, 0, 1); + this.#setPosition(posX, posY); + await this.#overlayManager.open(this.#dialog); + textInput.focus(); + } + async #save() { + this.#editor.comment = this.#textInput.value; + this.#finish(); + } + get _dialogDimensions() { + const dialog = this.#dialog; + const { + style + } = dialog; + style.opacity = "0"; + style.display = "block"; + const { + width, + height + } = dialog.getBoundingClientRect(); + style.opacity = style.display = ""; + return shadow(this, "_dialogDimensions", { + dialogWidth: width, + dialogHeight: height + }); + } + #setPosition(x, y) { + this.#dialogX = x; + this.#dialogY = y; + const { + style + } = this.#dialog; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; + } + #finish() { + if (!this.#editor) { + return; + } + const edited = this.#textInput.value !== this.#commentText; + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + edited + } + } + }); + this.#editor?.focusCommentButton(); + this.#editor = null; + this.#textInput.value = this.#previousText = this.#commentText = ""; + this.#overlayManager.closeIfActive(this.#dialog); + this.#textInput.style.height = ""; + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + } + destroy() { + this.#uiManager = null; + this.#editor = null; + this.#finish(); + } +} +class CommentPopup { + #buttonsContainer = null; + #eventBus; + #commentDialog; + #dateFormat; + #editor = null; + #isLTR; + #container = null; + #text = null; + #time = null; + #prevDragX = 0; + #prevDragY = 0; + #posX = 0; + #posY = 0; + #previousFocusedElement = null; + #selected = false; + #visible = false; + constructor(eventBus, dateFormat, ltr, commentDialog) { + this.#eventBus = eventBus; + this.#dateFormat = dateFormat; + this.#isLTR = ltr; + this.#commentDialog = commentDialog; + this.sidebar = null; + } + get _popupWidth() { + const container = this.#createPopup(); + const { + style + } = container; + style.opacity = "0"; + style.display = "block"; + document.body.append(container); + const width = container.getBoundingClientRect().width; + container.remove(); + style.opacity = style.display = ""; + return shadow(this, "_popupWidth", width); + } + #createPopup() { + if (this.#container) { + return this.#container; + } + const container = this.#container = document.createElement("div"); + container.className = "commentPopup"; + container.id = "commentPopup"; + container.tabIndex = -1; + container.role = "dialog"; + container.ariaModal = "false"; + container.addEventListener("contextmenu", noContextMenu); + container.addEventListener("keydown", e => { + if (e.key === "Escape") { + this.toggle(this.#editor, true, false); + this.#previousFocusedElement?.focus(); + stopEvent(e); + } + }); + container.addEventListener("click", () => { + container.focus(); + }); + const top = document.createElement("div"); + top.className = "commentPopupTop"; + const time = this.#time = document.createElement("time"); + time.className = "commentPopupTime"; + const buttons = this.#buttonsContainer = document.createElement("div"); + buttons.className = "commentPopupButtons"; + const edit = document.createElement("button"); + edit.classList.add("commentPopupEdit", "toolbarButton"); + edit.tabIndex = 0; + edit.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button"); + edit.ariaHasPopup = "dialog"; + edit.ariaControlsElements = [this.#commentDialog]; + const editLabel = document.createElement("span"); + editLabel.setAttribute("data-l10n-id", "pdfjs-editor-edit-comment-popup-button-label"); + edit.append(editLabel); + edit.addEventListener("click", () => { + const editor = this.#editor; + const height = parseFloat(getComputedStyle(this.#text).height); + this.toggle(editor, true, false); + editor.editComment({ + height + }); + }); + edit.addEventListener("contextmenu", noContextMenu); + const del = document.createElement("button"); + del.classList.add("commentPopupDelete", "toolbarButton"); + del.tabIndex = 0; + del.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button"); + const delLabel = document.createElement("span"); + delLabel.setAttribute("data-l10n-id", "pdfjs-editor-delete-comment-popup-button-label"); + del.append(delLabel); + del.addEventListener("click", () => { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "comment", + data: { + deleted: true + } + } + }); + this.#editor.comment = null; + this.destroy(); + }); + del.addEventListener("contextmenu", noContextMenu); + buttons.append(edit, del); + top.append(time, buttons); + const separator = document.createElement("hr"); + const text = this.#text = document.createElement("div"); + text.className = "commentPopupText"; + container.append(top, separator, text); + let pointerMoveAC; + const cancelDrag = () => { + container.classList.remove("dragging"); + pointerMoveAC?.abort(); + pointerMoveAC = null; + }; + top.addEventListener("pointerdown", e => { + if (pointerMoveAC) { + cancelDrag(); + return; + } + const { + target, + clientX, + clientY + } = e; + if (buttons.contains(target)) { + return; + } + stopEvent(e); + const { + width: parentWidth, + height: parentHeight + } = this.#editor.parentBoundingClientRect; + this.#prevDragX = clientX; + this.#prevDragY = clientY; + pointerMoveAC = new AbortController(); + const { + signal + } = pointerMoveAC; + container.classList.add("dragging"); + window.addEventListener("pointermove", ev => { + if (!pointerMoveAC) { + return; + } + const { + clientX: x, + clientY: y + } = ev; + this.#setPosition(this.#posX + (x - this.#prevDragX) / parentWidth, this.#posY + (y - this.#prevDragY) / parentHeight, false); + this.#prevDragX = x; + this.#prevDragY = y; + stopEvent(ev); + }, { + signal + }); + window.addEventListener("blur", cancelDrag, { + signal + }); + window.addEventListener("pointerup", ev => { + if (pointerMoveAC) { + cancelDrag(); + stopEvent(ev); + } + }, { + signal + }); + }); + return container; + } + updateColor(editor) { + if (this.#editor !== editor || !this.#visible) { + return; + } + const { + color, + opacity + } = editor.getData(); + this.#container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + } + _hide(editor) { + const container = this.#createPopup(); + container.classList.toggle("hidden", true); + container.classList.toggle("selected", false); + (editor || this.#editor)?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + this.#editor = null; + this.#selected = false; + this.#visible = false; + this.#text.replaceChildren(); + this.sidebar.selectComment(null); + } + toggle(editor, isSelected, visibility = undefined, isEditable = true) { + if (!editor) { + this.destroy(); + return; + } + if (isSelected) { + visibility ??= this.#editor === editor ? !this.#selected || !this.#visible : true; + } else { + if (this.#selected) { + return; + } + visibility ??= !this.#visible; + } + if (!visibility) { + this._hide(editor); + return; + } + this.#visible = true; + if (this.#editor !== editor) { + this.#editor?.setCommentButtonStates({ + selected: false, + hasPopup: false + }); + } + const container = this.#createPopup(); + this.#buttonsContainer.classList.toggle("hidden", !isEditable); + container.classList.toggle("hidden", false); + container.classList.toggle("selected", isSelected); + this.#selected = isSelected; + this.#editor = editor; + editor.setCommentButtonStates({ + selected: isSelected, + hasPopup: true + }); + const { + contentsObj, + richText, + creationDate, + modificationDate, + color, + opacity + } = editor.getData(); + container.style.backgroundColor = color && CommentManager._makeCommentColor(color, opacity) || ""; + this.#text.replaceChildren(); + const html = richText?.str && (!contentsObj?.str || richText.str === contentsObj.str) ? richText.html : contentsObj?.str; + if (html) { + renderRichText({ + html, + dir: contentsObj?.dir || "auto", + className: "richText" + }, this.#text); + } + this.#time.textContent = this.#dateFormat.format(PDFDateString.toDateObject(modificationDate || creationDate)); + this.#setPosition(...editor.commentPopupPosition, editor.hasDefaultPopupPosition()); + editor.elementBeforePopup.after(container); + container.addEventListener("focus", ({ + relatedTarget + }) => { + this.#previousFocusedElement = relatedTarget; + }, { + once: true + }); + if (isSelected) { + setTimeout(() => container.focus(), 0); + } + } + #setPosition(x, y, correctPosition) { + if (!correctPosition) { + this.#editor.commentPopupPosition = [x, y]; + } else { + const widthRatio = this._popupWidth / this.#editor.parentBoundingClientRect.width; + if (this.#isLTR && x + widthRatio > 1 || !this.#isLTR && x - widthRatio >= 0) { + const buttonWidth = this.#editor.commentButtonWidth; + x -= widthRatio - buttonWidth; + } + } + this.#posX = x; + this.#posY = y; + const { + style + } = this.#container; + style.left = `${100 * x}%`; + style.top = `${100 * y}%`; + } + destroy() { + this._hide(); + this.#container?.remove(); + this.#container = this.#text = this.#time = null; + this.#prevDragX = this.#prevDragY = Infinity; + this.#posX = this.#posY = 0; + this.#previousFocusedElement = null; + } +} + +;// ./web/download_manager.js + +function download(blobUrl, filename) { + const a = document.createElement("a"); + if (!a.click) { + throw new Error('DownloadManager: "a.click()" is not supported.'); + } + a.href = blobUrl; + a.target = "_parent"; + if ("download" in a) { + a.download = filename; + } + (document.body || document.documentElement).append(a); + a.click(); + a.remove(); +} +class DownloadManager { + #openBlobUrls = new WeakMap(); + downloadData(data, filename, contentType) { + const blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + download(blobUrl, filename); + } + openOrDownloadData(data, filename, dest = null) { + const isPdfData = isPdfFile(filename); + const contentType = isPdfData ? "application/pdf" : ""; + if (isPdfData) { + let blobUrl = this.#openBlobUrls.get(data); + if (!blobUrl) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: contentType + })); + this.#openBlobUrls.set(data, blobUrl); + } + let viewerUrl; + viewerUrl = "?file=" + encodeURIComponent(blobUrl + "#" + filename); + if (dest) { + viewerUrl += `#${escape(dest)}`; + } + try { + window.open(viewerUrl); + return true; + } catch (ex) { + console.error("openOrDownloadData:", ex); + URL.revokeObjectURL(blobUrl); + this.#openBlobUrls.delete(data); + } + } + this.downloadData(data, filename, contentType); + return false; + } + download(data, url, filename) { + let blobUrl; + if (data) { + blobUrl = URL.createObjectURL(new Blob([data], { + type: "application/pdf" + })); + } else { + if (!createValidAbsoluteUrl(url, "http://example.com")) { + console.error(`download - not a valid URL: ${url}`); + return; + } + blobUrl = url + "#pdfjs.action=download"; + } + download(blobUrl, filename); + } +} + +;// ./web/editor_undo_bar.js + +class EditorUndoBar { + #closeButton = null; + #container; + #eventBus = null; + #focusTimeout = null; + #initController = null; + isOpen = false; + #message; + #showController = null; + #undoButton; + static #l10nMessages = Object.freeze({ + highlight: "pdfjs-editor-undo-bar-message-highlight", + freetext: "pdfjs-editor-undo-bar-message-freetext", + stamp: "pdfjs-editor-undo-bar-message-stamp", + ink: "pdfjs-editor-undo-bar-message-ink", + signature: "pdfjs-editor-undo-bar-message-signature", + _multiple: "pdfjs-editor-undo-bar-message-multiple" + }); + constructor({ + container, + message, + undoButton, + closeButton + }, eventBus) { + this.#container = container; + this.#message = message; + this.#undoButton = undoButton; + this.#closeButton = closeButton; + this.#eventBus = eventBus; + } + destroy() { + this.#initController?.abort(); + this.#initController = null; + this.hide(); + } + show(undoAction, messageData) { + if (!this.#initController) { + this.#initController = new AbortController(); + const opts = { + signal: this.#initController.signal + }; + const boundHide = this.hide.bind(this); + this.#container.addEventListener("contextmenu", noContextMenu, opts); + this.#closeButton.addEventListener("click", boundHide, opts); + this.#eventBus._on("beforeprint", boundHide, opts); + this.#eventBus._on("download", boundHide, opts); + } + this.hide(); + if (typeof messageData === "string") { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages[messageData]); + } else { + this.#message.setAttribute("data-l10n-id", EditorUndoBar.#l10nMessages._multiple); + this.#message.setAttribute("data-l10n-args", JSON.stringify({ + count: messageData + })); + } + this.isOpen = true; + this.#container.hidden = false; + this.#showController = new AbortController(); + this.#undoButton.addEventListener("click", () => { + undoAction(); + this.hide(); + }, { + signal: this.#showController.signal + }); + this.#focusTimeout = setTimeout(() => { + this.#container.focus(); + this.#focusTimeout = null; + }, 100); + } + hide() { + if (!this.isOpen) { + return; + } + this.isOpen = false; + this.#container.hidden = true; + this.#showController?.abort(); + this.#showController = null; + if (this.#focusTimeout) { + clearTimeout(this.#focusTimeout); + this.#focusTimeout = null; + } + } +} + +;// ./web/overlay_manager.js +class OverlayManager { + #overlays = new WeakMap(); + #active = null; + get active() { + return this.#active; + } + async register(dialog, canForceClose = false) { + if (typeof dialog !== "object") { + throw new Error("Not enough parameters."); + } else if (this.#overlays.has(dialog)) { + throw new Error("The overlay is already registered."); + } + this.#overlays.set(dialog, { + canForceClose + }); + dialog.addEventListener("cancel", ({ + target + }) => { + if (this.#active === target) { + this.#active = null; + } + }); + } + async open(dialog) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (this.#active) { + if (this.#active === dialog) { + throw new Error("The overlay is already active."); + } else if (this.#overlays.get(dialog).canForceClose) { + await this.close(); + } else { + throw new Error("Another overlay is currently active."); + } + } + this.#active = dialog; + dialog.showModal(); + } + async close(dialog = this.#active) { + if (!this.#overlays.has(dialog)) { + throw new Error("The overlay does not exist."); + } else if (!this.#active) { + throw new Error("The overlay is currently not active."); + } else if (this.#active !== dialog) { + throw new Error("Another overlay is currently active."); + } + dialog.close(); + this.#active = null; + } + async closeIfActive(dialog) { + if (this.#active === dialog) { + await this.close(dialog); + } + } +} + +;// ./web/password_prompt.js + +class PasswordPrompt { + #activeCapability = null; + #updateCallback = null; + #reason = null; + constructor(options, overlayManager, isViewerEmbedded = false) { + this.dialog = options.dialog; + this.label = options.label; + this.input = options.input; + this.submitButton = options.submitButton; + this.cancelButton = options.cancelButton; + this.overlayManager = overlayManager; + this._isViewerEmbedded = isViewerEmbedded; + this.submitButton.addEventListener("click", this.#verify.bind(this)); + this.cancelButton.addEventListener("click", this.close.bind(this)); + this.input.addEventListener("keydown", e => { + if (e.keyCode === 13) { + this.#verify(); + } + }); + this.overlayManager.register(this.dialog, true); + this.dialog.addEventListener("close", this.#cancel.bind(this)); + } + async open() { + await this.#activeCapability?.promise; + this.#activeCapability = Promise.withResolvers(); + try { + await this.overlayManager.open(this.dialog); + } catch (ex) { + this.#activeCapability.resolve(); + throw ex; + } + const passwordIncorrect = this.#reason === PasswordResponses.INCORRECT_PASSWORD; + if (!this._isViewerEmbedded || passwordIncorrect) { + this.input.focus(); + } + this.label.setAttribute("data-l10n-id", passwordIncorrect ? "pdfjs-password-invalid" : "pdfjs-password-label"); + } + async close() { + this.overlayManager.closeIfActive(this.dialog); + } + #verify() { + const password = this.input.value; + if (password?.length > 0) { + this.#invokeCallback(password); + } + } + #cancel() { + this.#invokeCallback(new Error("PasswordPrompt cancelled.")); + this.#activeCapability.resolve(); + } + #invokeCallback(password) { + if (!this.#updateCallback) { + return; + } + this.close(); + this.input.value = ""; + this.#updateCallback(password); + this.#updateCallback = null; + } + async setUpdateCallback(updateCallback, reason) { + if (this.#activeCapability) { + await this.#activeCapability.promise; + } + this.#updateCallback = updateCallback; + this.#reason = reason; + } +} + +;// ./web/base_tree_viewer.js + +const TREEITEM_OFFSET_TOP = -100; +const TREEITEM_SELECTED_CLASS = "selected"; +class BaseTreeViewer { + constructor(options) { + this.container = options.container; + this.eventBus = options.eventBus; + this._l10n = options.l10n; + this.reset(); + } + reset() { + this._pdfDocument = null; + this._lastToggleIsShow = true; + this._currentTreeItem = null; + this.container.textContent = ""; + this.container.classList.remove("treeWithDeepNesting"); + } + _dispatchEvent(count) { + throw new Error("Not implemented: _dispatchEvent"); + } + _bindLink(element, params) { + throw new Error("Not implemented: _bindLink"); + } + _normalizeTextContent(str) { + return removeNullCharacters(str, true) || "\u2013"; + } + _addToggleButton(div, hidden = false) { + const toggler = document.createElement("div"); + toggler.className = "treeItemToggler"; + if (hidden) { + toggler.classList.add("treeItemsHidden"); + } + toggler.onclick = evt => { + evt.stopPropagation(); + toggler.classList.toggle("treeItemsHidden"); + if (evt.shiftKey) { + const shouldShowAll = !toggler.classList.contains("treeItemsHidden"); + this._toggleTreeItem(div, shouldShowAll); + } + }; + div.prepend(toggler); + } + _toggleTreeItem(root, show = false) { + this._l10n.pause(); + this._lastToggleIsShow = show; + for (const toggler of root.querySelectorAll(".treeItemToggler")) { + toggler.classList.toggle("treeItemsHidden", !show); + } + this._l10n.resume(); + } + _toggleAllTreeItems() { + this._toggleTreeItem(this.container, !this._lastToggleIsShow); + } + _finishRendering(fragment, count, hasAnyNesting = false) { + if (hasAnyNesting) { + this.container.classList.add("treeWithDeepNesting"); + this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden"); + } + this._l10n.pause(); + this.container.append(fragment); + this._l10n.resume(); + this._dispatchEvent(count); + } + render(params) { + throw new Error("Not implemented: render"); + } + _updateCurrentTreeItem(treeItem = null) { + if (this._currentTreeItem) { + this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = null; + } + if (treeItem) { + treeItem.classList.add(TREEITEM_SELECTED_CLASS); + this._currentTreeItem = treeItem; + } + } + _scrollToCurrentTreeItem(treeItem) { + if (!treeItem) { + return; + } + this._l10n.pause(); + let currentNode = treeItem.parentNode; + while (currentNode && currentNode !== this.container) { + if (currentNode.classList.contains("treeItem")) { + const toggler = currentNode.firstElementChild; + toggler?.classList.remove("treeItemsHidden"); + } + currentNode = currentNode.parentNode; + } + this._l10n.resume(); + this._updateCurrentTreeItem(treeItem); + this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP); + } +} + +;// ./web/pdf_attachment_viewer.js + + +class PDFAttachmentViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.downloadManager = options.downloadManager; + this.eventBus._on("fileattachmentannotation", this.#appendAttachment.bind(this)); + } + reset(keepRenderedCapability = false) { + super.reset(); + this._attachments = null; + if (!keepRenderedCapability) { + this._renderedCapability = Promise.withResolvers(); + } + this._pendingDispatchEvent = false; + } + async _dispatchEvent(attachmentsCount) { + this._renderedCapability.resolve(); + if (attachmentsCount === 0 && !this._pendingDispatchEvent) { + this._pendingDispatchEvent = true; + await waitOnEventOrTimeout({ + target: this.eventBus, + name: "annotationlayerrendered", + delay: 1000 + }); + if (!this._pendingDispatchEvent) { + return; + } + } + this._pendingDispatchEvent = false; + this.eventBus.dispatch("attachmentsloaded", { + source: this, + attachmentsCount + }); + } + _bindLink(element, { + content, + description, + filename + }) { + if (description) { + element.title = description; + } + element.onclick = () => { + this.downloadManager.openOrDownloadData(content, filename); + return false; + }; + } + render({ + attachments, + keepRenderedCapability = false + }) { + if (this._attachments) { + this.reset(keepRenderedCapability); + } + this._attachments = attachments || null; + if (!attachments) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + let attachmentsCount = 0; + for (const name in attachments) { + const item = attachments[name]; + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + element.textContent = this._normalizeTextContent(item.filename); + div.append(element); + fragment.append(div); + attachmentsCount++; + } + this._finishRendering(fragment, attachmentsCount); + } + #appendAttachment(item) { + const renderedPromise = this._renderedCapability.promise; + renderedPromise.then(() => { + if (renderedPromise !== this._renderedCapability.promise) { + return; + } + const attachments = this._attachments || Object.create(null); + for (const name in attachments) { + if (item.filename === name) { + return; + } + } + attachments[item.filename] = item; + this.render({ + attachments, + keepRenderedCapability: true + }); + }); + } +} + +;// ./web/grab_to_pan.js + +const CSS_CLASS_GRAB = "grab-to-pan-grab"; +class GrabToPan { + #activateAC = null; + #mouseDownAC = null; + #scrollAC = null; + constructor({ + element + }) { + this.element = element; + this.document = element.ownerDocument; + const overlay = this.overlay = document.createElement("div"); + overlay.className = "grab-to-pan-grabbing"; + } + activate() { + if (!this.#activateAC) { + this.#activateAC = new AbortController(); + this.element.addEventListener("mousedown", this.#onMouseDown.bind(this), { + capture: true, + signal: this.#activateAC.signal + }); + this.element.classList.add(CSS_CLASS_GRAB); + } + } + deactivate() { + if (this.#activateAC) { + this.#activateAC.abort(); + this.#activateAC = null; + this.#endPan(); + this.element.classList.remove(CSS_CLASS_GRAB); + } + } + toggle() { + if (this.#activateAC) { + this.deactivate(); + } else { + this.activate(); + } + } + ignoreTarget(node) { + return node.matches("a[href], a[href] *, input, textarea, button, button *, select, option"); + } + #onMouseDown(event) { + if (event.button !== 0 || this.ignoreTarget(event.target)) { + return; + } + if (event.originalTarget) { + try { + event.originalTarget.tagName; + } catch { + return; + } + } + this.scrollLeftStart = this.element.scrollLeft; + this.scrollTopStart = this.element.scrollTop; + this.clientXStart = event.clientX; + this.clientYStart = event.clientY; + this.#mouseDownAC = new AbortController(); + const boundEndPan = this.#endPan.bind(this), + mouseOpts = { + capture: true, + signal: this.#mouseDownAC.signal + }; + this.document.addEventListener("mousemove", this.#onMouseMove.bind(this), mouseOpts); + this.document.addEventListener("mouseup", boundEndPan, mouseOpts); + this.#scrollAC = new AbortController(); + this.element.addEventListener("scroll", boundEndPan, { + capture: true, + signal: this.#scrollAC.signal + }); + stopEvent(event); + const focusedElement = document.activeElement; + if (focusedElement && !focusedElement.contains(event.target)) { + focusedElement.blur(); + } + } + #onMouseMove(event) { + this.#scrollAC?.abort(); + this.#scrollAC = null; + if (!(event.buttons & 1)) { + this.#endPan(); + return; + } + const xDiff = event.clientX - this.clientXStart; + const yDiff = event.clientY - this.clientYStart; + this.element.scrollTo({ + top: this.scrollTopStart - yDiff, + left: this.scrollLeftStart - xDiff, + behavior: "instant" + }); + if (!this.overlay.parentNode) { + document.body.append(this.overlay); + } + } + #endPan() { + this.#mouseDownAC?.abort(); + this.#mouseDownAC = null; + this.#scrollAC?.abort(); + this.#scrollAC = null; + this.overlay.remove(); + } +} + +;// ./web/pdf_cursor_tools.js + + + +class PDFCursorTools { + #active = CursorTool.SELECT; + #prevActive = null; + constructor({ + container, + eventBus, + cursorToolOnLoad = CursorTool.SELECT + }) { + this.container = container; + this.eventBus = eventBus; + this.#addEventListeners(); + Promise.resolve().then(() => { + this.switchTool(cursorToolOnLoad); + }); + } + get activeTool() { + return this.#active; + } + switchTool(tool) { + if (this.#prevActive !== null) { + return; + } + this.#switchTool(tool); + } + #switchTool(tool, disabled = false) { + if (tool === this.#active) { + if (this.#prevActive !== null) { + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + return; + } + const disableActiveTool = () => { + switch (this.#active) { + case CursorTool.SELECT: + break; + case CursorTool.HAND: + this._handTool.deactivate(); + break; + case CursorTool.ZOOM: + } + }; + switch (tool) { + case CursorTool.SELECT: + disableActiveTool(); + break; + case CursorTool.HAND: + disableActiveTool(); + this._handTool.activate(); + break; + case CursorTool.ZOOM: + default: + console.error(`switchTool: "${tool}" is an unsupported value.`); + return; + } + this.#active = tool; + this.eventBus.dispatch("cursortoolchanged", { + source: this, + tool, + disabled + }); + } + #addEventListeners() { + this.eventBus._on("switchcursortool", evt => { + if (!evt.reset) { + this.switchTool(evt.tool); + } else if (this.#prevActive !== null) { + annotationEditorMode = AnnotationEditorType.NONE; + presentationModeState = PresentationModeState.NORMAL; + enableActive(); + } + }); + let annotationEditorMode = AnnotationEditorType.NONE, + presentationModeState = PresentationModeState.NORMAL; + const disableActive = () => { + this.#prevActive ??= this.#active; + this.#switchTool(CursorTool.SELECT, true); + }; + const enableActive = () => { + if (this.#prevActive !== null && annotationEditorMode === AnnotationEditorType.NONE && presentationModeState === PresentationModeState.NORMAL) { + this.#switchTool(this.#prevActive); + this.#prevActive = null; + } + }; + this.eventBus._on("annotationeditormodechanged", ({ + mode + }) => { + annotationEditorMode = mode; + if (mode === AnnotationEditorType.NONE) { + enableActive(); + } else { + disableActive(); + } + }); + this.eventBus._on("presentationmodechanged", ({ + state + }) => { + presentationModeState = state; + if (state === PresentationModeState.NORMAL) { + enableActive(); + } else if (state === PresentationModeState.FULLSCREEN) { + disableActive(); + } + }); + } + get _handTool() { + return shadow(this, "_handTool", new GrabToPan({ + element: this.container + })); + } +} + +;// ./web/pdf_document_properties.js + + +const NON_METRIC_LOCALES = ["en-us", "en-lr", "my"]; +const US_PAGE_NAMES = { + "8.5x11": "pdfjs-document-properties-page-size-name-letter", + "8.5x14": "pdfjs-document-properties-page-size-name-legal" +}; +const METRIC_PAGE_NAMES = { + "297x420": "pdfjs-document-properties-page-size-name-a-three", + "210x297": "pdfjs-document-properties-page-size-name-a-four" +}; +function getPageName(size, isPortrait, pageNames) { + const width = isPortrait ? size.width : size.height; + const height = isPortrait ? size.height : size.width; + return pageNames[`${width}x${height}`]; +} +class PDFDocumentProperties { + #fieldData = null; + constructor({ + dialog, + fields, + closeButton + }, overlayManager, eventBus, l10n, fileNameLookup, titleLookup) { + this.dialog = dialog; + this.fields = fields; + this.overlayManager = overlayManager; + this.l10n = l10n; + this._fileNameLookup = fileNameLookup; + this._titleLookup = titleLookup; + this.#reset(); + closeButton.addEventListener("click", this.close.bind(this)); + this.overlayManager.register(this.dialog); + eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + eventBus._on("rotationchanging", evt => { + this._pagesRotation = evt.pagesRotation; + }); + } + async open() { + await Promise.all([this.overlayManager.open(this.dialog), this._dataAvailableCapability.promise]); + const currentPageNumber = this._currentPageNumber; + const pagesRotation = this._pagesRotation; + if (this.#fieldData && currentPageNumber === this.#fieldData._currentPageNumber && pagesRotation === this.#fieldData._pagesRotation) { + this.#updateUI(); + return; + } + const [{ + info, + metadata, + contentLength + }, pdfPage] = await Promise.all([this.pdfDocument.getMetadata(), this.pdfDocument.getPage(currentPageNumber)]); + const [fileName, fileSize, title, creationDate, modificationDate, pageSize, isLinearized] = await Promise.all([this._fileNameLookup(), this.#parseFileSize(contentLength), this._titleLookup(), this.#parseDate(metadata?.get("xmp:createdate"), info.CreationDate), this.#parseDate(metadata?.get("xmp:modifydate"), info.ModDate), this.#parsePageSize(getPageSizeInches(pdfPage), pagesRotation), this.#parseLinearization(info.IsLinearized)]); + this.#fieldData = Object.freeze({ + fileName, + fileSize, + title, + author: metadata?.get("dc:creator")?.join("\n") || info.Author, + subject: metadata?.get("dc:subject")?.join("\n") || info.Subject, + keywords: metadata?.get("pdf:keywords") || info.Keywords, + creationDate, + modificationDate, + creator: metadata?.get("xmp:creatortool") || info.Creator, + producer: metadata?.get("pdf:producer") || info.Producer, + version: info.PDFFormatVersion, + pageCount: this.pdfDocument.numPages, + pageSize, + linearized: isLinearized, + _currentPageNumber: currentPageNumber, + _pagesRotation: pagesRotation + }); + this.#updateUI(); + const { + length + } = await this.pdfDocument.getDownloadInfo(); + if (contentLength === length) { + return; + } + const data = Object.assign(Object.create(null), this.#fieldData); + data.fileSize = await this.#parseFileSize(length); + this.#fieldData = Object.freeze(data); + this.#updateUI(); + } + async close() { + this.overlayManager.close(this.dialog); + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#reset(); + this.#updateUI(); + } + if (!pdfDocument) { + return; + } + this.pdfDocument = pdfDocument; + this._dataAvailableCapability.resolve(); + } + #reset() { + this.pdfDocument = null; + this.#fieldData = null; + this._dataAvailableCapability = Promise.withResolvers(); + this._currentPageNumber = 1; + this._pagesRotation = 0; + } + #updateUI() { + if (this.#fieldData && this.overlayManager.active !== this.dialog) { + return; + } + for (const id in this.fields) { + const content = this.#fieldData?.[id]; + this.fields[id].textContent = content || content === 0 ? content : "-"; + } + } + async #parseFileSize(b = 0) { + const kb = b / 1024, + mb = kb / 1024; + return kb ? this.l10n.get(mb >= 1 ? "pdfjs-document-properties-size-mb" : "pdfjs-document-properties-size-kb", { + mb, + kb, + b + }) : undefined; + } + async #parsePageSize(pageSizeInches, pagesRotation) { + if (!pageSizeInches) { + return undefined; + } + if (pagesRotation % 180 !== 0) { + pageSizeInches = { + width: pageSizeInches.height, + height: pageSizeInches.width + }; + } + const isPortrait = isPortraitOrientation(pageSizeInches), + nonMetric = NON_METRIC_LOCALES.includes(this.l10n.getLanguage()); + let sizeInches = { + width: Math.round(pageSizeInches.width * 100) / 100, + height: Math.round(pageSizeInches.height * 100) / 100 + }; + let sizeMillimeters = { + width: Math.round(pageSizeInches.width * 25.4 * 10) / 10, + height: Math.round(pageSizeInches.height * 25.4 * 10) / 10 + }; + let nameId = getPageName(sizeInches, isPortrait, US_PAGE_NAMES) || getPageName(sizeMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (!nameId && !(Number.isInteger(sizeMillimeters.width) && Number.isInteger(sizeMillimeters.height))) { + const exactMillimeters = { + width: pageSizeInches.width * 25.4, + height: pageSizeInches.height * 25.4 + }; + const intMillimeters = { + width: Math.round(sizeMillimeters.width), + height: Math.round(sizeMillimeters.height) + }; + if (Math.abs(exactMillimeters.width - intMillimeters.width) < 0.1 && Math.abs(exactMillimeters.height - intMillimeters.height) < 0.1) { + nameId = getPageName(intMillimeters, isPortrait, METRIC_PAGE_NAMES); + if (nameId) { + sizeInches = { + width: Math.round(intMillimeters.width / 25.4 * 100) / 100, + height: Math.round(intMillimeters.height / 25.4 * 100) / 100 + }; + sizeMillimeters = intMillimeters; + } + } + } + const [{ + width, + height + }, unit, name, orientation] = await Promise.all([nonMetric ? sizeInches : sizeMillimeters, this.l10n.get(nonMetric ? "pdfjs-document-properties-page-size-unit-inches" : "pdfjs-document-properties-page-size-unit-millimeters"), nameId && this.l10n.get(nameId), this.l10n.get(isPortrait ? "pdfjs-document-properties-page-size-orientation-portrait" : "pdfjs-document-properties-page-size-orientation-landscape")]); + return this.l10n.get(name ? "pdfjs-document-properties-page-size-dimension-name-string" : "pdfjs-document-properties-page-size-dimension-string", { + width, + height, + unit, + name, + orientation + }); + } + async #parseDate(metadataDate, infoDate) { + const dateObj = Date.parse(metadataDate) || PDFDateString.toDateObject(infoDate); + return dateObj ? this.l10n.get("pdfjs-document-properties-date-time-string", { + dateObj: dateObj.valueOf() + }) : undefined; + } + #parseLinearization(isLinearized) { + return this.l10n.get(isLinearized ? "pdfjs-document-properties-linearized-yes" : "pdfjs-document-properties-linearized-no"); + } +} + +;// ./web/pdf_find_utils.js +const CharacterType = { + SPACE: 0, + ALPHA_LETTER: 1, + PUNCT: 2, + HAN_LETTER: 3, + KATAKANA_LETTER: 4, + HIRAGANA_LETTER: 5, + HALFWIDTH_KATAKANA_LETTER: 6, + THAI_LETTER: 7 +}; +function isAlphabeticalScript(charCode) { + return charCode < 0x2e80; +} +function isAscii(charCode) { + return (charCode & 0xff80) === 0; +} +function isAsciiAlpha(charCode) { + return charCode >= 0x61 && charCode <= 0x7a || charCode >= 0x41 && charCode <= 0x5a; +} +function isAsciiDigit(charCode) { + return charCode >= 0x30 && charCode <= 0x39; +} +function isAsciiSpace(charCode) { + return charCode === 0x20 || charCode === 0x09 || charCode === 0x0d || charCode === 0x0a; +} +function isHan(charCode) { + return charCode >= 0x3400 && charCode <= 0x9fff || charCode >= 0xf900 && charCode <= 0xfaff; +} +function isKatakana(charCode) { + return charCode >= 0x30a0 && charCode <= 0x30ff; +} +function isHiragana(charCode) { + return charCode >= 0x3040 && charCode <= 0x309f; +} +function isHalfwidthKatakana(charCode) { + return charCode >= 0xff60 && charCode <= 0xff9f; +} +function isThai(charCode) { + return (charCode & 0xff80) === 0x0e00; +} +function getCharacterType(charCode) { + if (isAlphabeticalScript(charCode)) { + if (isAscii(charCode)) { + if (isAsciiSpace(charCode)) { + return CharacterType.SPACE; + } else if (isAsciiAlpha(charCode) || isAsciiDigit(charCode) || charCode === 0x5f) { + return CharacterType.ALPHA_LETTER; + } + return CharacterType.PUNCT; + } else if (isThai(charCode)) { + return CharacterType.THAI_LETTER; + } else if (charCode === 0xa0) { + return CharacterType.SPACE; + } + return CharacterType.ALPHA_LETTER; + } + if (isHan(charCode)) { + return CharacterType.HAN_LETTER; + } else if (isKatakana(charCode)) { + return CharacterType.KATAKANA_LETTER; + } else if (isHiragana(charCode)) { + return CharacterType.HIRAGANA_LETTER; + } else if (isHalfwidthKatakana(charCode)) { + return CharacterType.HALFWIDTH_KATAKANA_LETTER; + } + return CharacterType.ALPHA_LETTER; +} +let NormalizeWithNFKC; +function getNormalizeWithNFKC() { + NormalizeWithNFKC ||= ` ¨ª¯²-µ¸-º¼-¾IJ-ijĿ-ŀʼnſDŽ-njDZ-dzʰ-ʸ˘-˝ˠ-ˤʹͺ;΄-΅·ϐ-ϖϰ-ϲϴ-ϵϹևٵ-ٸक़-य़ড়-ঢ়য়ਲ਼ਸ਼ਖ਼-ਜ਼ਫ਼ଡ଼-ଢ଼ำຳໜ-ໝ༌གྷཌྷདྷབྷཛྷཀྵჼᴬ-ᴮᴰ-ᴺᴼ-ᵍᵏ-ᵪᵸᶛ-ᶿẚ-ẛάέήίόύώΆ᾽-῁ΈΉ῍-῏ΐΊ῝-῟ΰΎ῭-`ΌΏ´-῾ - ‑‗․-… ″-‴‶-‷‼‾⁇-⁉⁗ ⁰-ⁱ⁴-₎ₐ-ₜ₨℀-℃℅-ℇ℉-ℓℕ-№ℙ-ℝ℠-™ℤΩℨK-ℭℯ-ℱℳ-ℹ℻-⅀ⅅ-ⅉ⅐-ⅿ↉∬-∭∯-∰〈-〉①-⓪⨌⩴-⩶⫝̸ⱼ-ⱽⵯ⺟⻳⼀-⿕ 〶〸-〺゛-゜ゟヿㄱ-ㆎ㆒-㆟㈀-㈞㈠-㉇㉐-㉾㊀-㏿ꚜ-ꚝꝰꟲ-ꟴꟸ-ꟹꭜ-ꭟꭩ豈-嗀塚晴凞-羽蘒諸逸-都飯-舘並-龎ff-stﬓ-ﬗיִײַ-זּטּ-לּמּנּ-סּףּ-פּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-﷼︐-︙︰-﹄﹇-﹒﹔-﹦﹨-﹫ﹰ-ﹲﹴﹶ-ﻼ!-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ¢-₩`; + return NormalizeWithNFKC; +} + +;// ./web/pdf_find_controller.js + + +const FindState = { + FOUND: 0, + NOT_FOUND: 1, + WRAPPED: 2, + PENDING: 3 +}; +const FIND_TIMEOUT = 250; +const MATCH_SCROLL_OFFSET_TOP = -50; +const CHARACTERS_TO_NORMALIZE = { + "\u2010": "-", + "\u2018": "'", + "\u2019": "'", + "\u201A": "'", + "\u201B": "'", + "\u201C": '"', + "\u201D": '"', + "\u201E": '"', + "\u201F": '"', + "\u00BC": "1/4", + "\u00BD": "1/2", + "\u00BE": "3/4" +}; +const DIACRITICS_EXCEPTION = new Set([0x3099, 0x309a, 0x094d, 0x09cd, 0x0a4d, 0x0acd, 0x0b4d, 0x0bcd, 0x0c4d, 0x0ccd, 0x0d3b, 0x0d3c, 0x0d4d, 0x0dca, 0x0e3a, 0x0eba, 0x0f84, 0x1039, 0x103a, 0x1714, 0x1734, 0x17d2, 0x1a60, 0x1b44, 0x1baa, 0x1bab, 0x1bf2, 0x1bf3, 0x2d7f, 0xa806, 0xa82c, 0xa8c4, 0xa953, 0xa9c0, 0xaaf6, 0xabed, 0x0c56, 0x0f71, 0x0f72, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f80, 0x0f74]); +let DIACRITICS_EXCEPTION_STR; +const DIACRITICS_REG_EXP = /\p{M}+/gu; +const SPECIAL_CHARS_REG_EXP = /([.*+?^${}()|[\]\\])|(\p{P})|(\s+)|(\p{M})|(\p{L})/gu; +const NOT_DIACRITIC_FROM_END_REG_EXP = /([^\p{M}])\p{M}*$/u; +const NOT_DIACRITIC_FROM_START_REG_EXP = /^\p{M}*([^\p{M}])/u; +const SYLLABLES_REG_EXP = /[\uAC00-\uD7AF\uFA6C\uFACF-\uFAD1\uFAD5-\uFAD7]+/g; +const SYLLABLES_LENGTHS = new Map(); +const FIRST_CHAR_SYLLABLES_REG_EXP = "[\\u1100-\\u1112\\ud7a4-\\ud7af\\ud84a\\ud84c\\ud850\\ud854\\ud857\\ud85f]"; +const NFKC_CHARS_TO_NORMALIZE = new Map(); +let noSyllablesRegExp = null; +let withSyllablesRegExp = null; +function normalize(text, options = {}) { + const syllablePositions = []; + let m; + while ((m = SYLLABLES_REG_EXP.exec(text)) !== null) { + let { + index + } = m; + for (const char of m[0]) { + let len = SYLLABLES_LENGTHS.get(char); + if (!len) { + len = char.normalize("NFD").length; + SYLLABLES_LENGTHS.set(char, len); + } + syllablePositions.push([len, index++]); + } + } + const hasSyllables = syllablePositions.length > 0; + const ignoreDashEOL = options.ignoreDashEOL ?? false; + let normalizationRegex; + if (!hasSyllables && noSyllablesRegExp) { + normalizationRegex = noSyllablesRegExp; + } else if (hasSyllables && withSyllablesRegExp) { + normalizationRegex = withSyllablesRegExp; + } else { + const replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(""); + const toNormalizeWithNFKC = getNormalizeWithNFKC(); + const CJK = "(?:\\p{Ideographic}|[\u3040-\u30FF])"; + const HKDiacritics = "(?:\u3099|\u309A)"; + const BrokenWord = `\\p{Ll}-\\n(?=\\p{Ll})|\\p{Lu}-\\n(?=\\p{L})`; + const regexps = [`[${replace}]`, `[${toNormalizeWithNFKC}]`, `${HKDiacritics}\\n`, "\\p{M}+(?:-\\n)?", `${BrokenWord}`, "\\S-\\n", `${CJK}\\n`, "\\n", hasSyllables ? FIRST_CHAR_SYLLABLES_REG_EXP : "\\u0000"]; + normalizationRegex = new RegExp(regexps.map(r => `(${r})`).join("|"), "gum"); + if (hasSyllables) { + withSyllablesRegExp = normalizationRegex; + } else { + noSyllablesRegExp = normalizationRegex; + } + } + const rawDiacriticsPositions = []; + while ((m = DIACRITICS_REG_EXP.exec(text)) !== null) { + rawDiacriticsPositions.push([m[0].length, m.index]); + } + let normalized = text.normalize("NFD"); + const positions = [0, 0]; + let rawDiacriticsIndex = 0; + let syllableIndex = 0; + let shift = 0; + let shiftOrigin = 0; + let eol = 0; + let hasDiacritics = false; + normalized = normalized.replace(normalizationRegex, (match, p1, p2, p3, p4, p5, p6, p7, p8, p9, i) => { + i -= shiftOrigin; + if (p1) { + const replacement = CHARACTERS_TO_NORMALIZE[p1]; + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p2) { + let replacement = NFKC_CHARS_TO_NORMALIZE.get(p2); + if (!replacement) { + replacement = p2.normalize("NFKC"); + NFKC_CHARS_TO_NORMALIZE.set(p2, replacement); + } + const jj = replacement.length; + for (let j = 1; j < jj; j++) { + positions.push(i - shift + j, shift - j); + } + shift -= jj - 1; + return replacement; + } + if (p3) { + hasDiacritics = true; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + ++rawDiacriticsIndex; + } else { + positions.push(i - 1 - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + } + positions.push(i - shift + 1, shift); + shiftOrigin += 1; + eol += 1; + return p3.charAt(0); + } + if (p4) { + const hasTrailingDashEOL = p4.endsWith("\n"); + const len = hasTrailingDashEOL ? p4.length - 2 : p4.length; + hasDiacritics = true; + let jj = len; + if (i + eol === rawDiacriticsPositions[rawDiacriticsIndex]?.[1]) { + jj -= rawDiacriticsPositions[rawDiacriticsIndex][0]; + ++rawDiacriticsIndex; + } + for (let j = 1; j <= jj; j++) { + positions.push(i - 1 - shift + j, shift - j); + } + shift -= jj; + shiftOrigin += jj; + if (hasTrailingDashEOL) { + i += len - 1; + positions.push(i - shift + 1, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p4.slice(0, len); + } + return p4; + } + if (p5) { + if (ignoreDashEOL) { + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -1); + } + const len = p5.length - 2; + positions.push(i - shift + len, 1 + shift); + shift += 1; + shiftOrigin += 1; + eol += 1; + return p5.slice(0, -2); + } + if (p6) { + shiftOrigin += 1; + eol += 1; + return p6.slice(0, -1); + } + if (p7) { + const len = p7.length - 1; + positions.push(i - shift + len, shift); + shiftOrigin += 1; + eol += 1; + return p7.slice(0, -1); + } + if (p8) { + positions.push(i - shift + 1, shift - 1); + shift -= 1; + shiftOrigin += 1; + eol += 1; + return " "; + } + if (i + eol === syllablePositions[syllableIndex]?.[1]) { + const newCharLen = syllablePositions[syllableIndex][0] - 1; + ++syllableIndex; + for (let j = 1; j <= newCharLen; j++) { + positions.push(i - (shift - j), shift - j); + } + shift -= newCharLen; + shiftOrigin += newCharLen; + } + return p9; + }); + positions.push(normalized.length, shift); + const starts = new Uint32Array(positions.length >> 1); + const shifts = new Int32Array(positions.length >> 1); + for (let i = 0, ii = positions.length; i < ii; i += 2) { + starts[i >> 1] = positions[i]; + shifts[i >> 1] = positions[i + 1]; + } + return [normalized, [starts, shifts], hasDiacritics]; +} +function getOriginalIndex(diffs, pos, len) { + if (!diffs) { + return [pos, len]; + } + const [starts, shifts] = diffs; + const start = pos; + const end = pos + len - 1; + let i = binarySearchFirstItem(starts, x => x >= start); + if (starts[i] > start) { + --i; + } + let j = binarySearchFirstItem(starts, x => x >= end, i); + if (starts[j] > end) { + --j; + } + const oldStart = start + shifts[i]; + const oldEnd = end + shifts[j]; + const oldLen = oldEnd + 1 - oldStart; + return [oldStart, oldLen]; +} +class PDFFindController { + #state = null; + #updateMatchesCountOnProgress = true; + #visitedPagesCount = 0; + constructor({ + linkService, + eventBus, + updateMatchesCountOnProgress = true + }) { + this._linkService = linkService; + this._eventBus = eventBus; + this.#updateMatchesCountOnProgress = updateMatchesCountOnProgress; + this.onIsPageVisible = null; + this.#reset(); + eventBus._on("find", this.#onFind.bind(this)); + eventBus._on("findbarclose", this.#onFindBarClose.bind(this)); + } + get highlightMatches() { + return this._highlightMatches; + } + get pageMatches() { + return this._pageMatches; + } + get pageMatchesLength() { + return this._pageMatchesLength; + } + get selected() { + return this._selected; + } + get state() { + return this.#state; + } + setDocument(pdfDocument) { + if (this._pdfDocument) { + this.#reset(); + } + if (!pdfDocument) { + return; + } + this._pdfDocument = pdfDocument; + this._firstPageCapability.resolve(); + } + #onFind(state) { + if (!state) { + return; + } + const pdfDocument = this._pdfDocument; + const { + type + } = state; + if (this.#state === null || this.#shouldDirtyMatch(state)) { + this._dirtyMatch = true; + } + this.#state = state; + if (type !== "highlightallchange") { + this.#updateUIState(FindState.PENDING); + } + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + this.#extractText(); + const findbarClosed = !this._highlightMatches; + const pendingTimeout = !!this._findTimeout; + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (!type) { + this._findTimeout = setTimeout(() => { + this.#nextMatch(); + this._findTimeout = null; + }, FIND_TIMEOUT); + } else if (this._dirtyMatch) { + this.#nextMatch(); + } else if (type === "again") { + this.#nextMatch(); + if (findbarClosed && this.#state.highlightAll) { + this.#updateAllPages(); + } + } else if (type === "highlightallchange") { + if (pendingTimeout) { + this.#nextMatch(); + } else { + this._highlightMatches = true; + } + this.#updateAllPages(); + } else { + this.#nextMatch(); + } + }); + } + scrollMatchIntoView({ + element = null, + selectedLeft = 0, + pageIndex = -1, + matchIndex = -1 + }) { + if (!this._scrollMatches || !element) { + return; + } else if (matchIndex === -1 || matchIndex !== this._selected.matchIdx) { + return; + } else if (pageIndex === -1 || pageIndex !== this._selected.pageIdx) { + return; + } + this._scrollMatches = false; + const spot = { + top: MATCH_SCROLL_OFFSET_TOP, + left: selectedLeft + }; + scrollIntoView(element, spot, true); + } + #reset() { + this._highlightMatches = false; + this._scrollMatches = false; + this._pdfDocument = null; + this._pageMatches = []; + this._pageMatchesLength = []; + this.#visitedPagesCount = 0; + this.#state = null; + this._selected = { + pageIdx: -1, + matchIdx: -1 + }; + this._offset = { + pageIdx: null, + matchIdx: null, + wrapped: false + }; + this._extractTextPromises = []; + this._pageContents = []; + this._pageDiffs = []; + this._hasDiacritics = []; + this._matchesCountTotal = 0; + this._pagesToSearch = null; + this._pendingFindMatches = new Set(); + this._resumePageIdx = null; + this._dirtyMatch = false; + clearTimeout(this._findTimeout); + this._findTimeout = null; + this._firstPageCapability = Promise.withResolvers(); + } + get #query() { + const { + query + } = this.#state; + if (typeof query === "string") { + if (query !== this._rawQuery) { + this._rawQuery = query; + [this._normalizedQuery] = normalize(query); + } + return this._normalizedQuery; + } + return (query || []).filter(q => !!q).map(q => normalize(q)[0]); + } + #shouldDirtyMatch(state) { + const newQuery = state.query, + prevQuery = this.#state.query; + const newType = typeof newQuery, + prevType = typeof prevQuery; + if (newType !== prevType) { + return true; + } + if (newType === "string") { + if (newQuery !== prevQuery) { + return true; + } + } else if (JSON.stringify(newQuery) !== JSON.stringify(prevQuery)) { + return true; + } + switch (state.type) { + case "again": + const pageNumber = this._selected.pageIdx + 1; + const linkService = this._linkService; + return pageNumber >= 1 && pageNumber <= linkService.pagesCount && pageNumber !== linkService.page && !(this.onIsPageVisible?.(pageNumber) ?? true); + case "highlightallchange": + return false; + } + return true; + } + #isEntireWord(content, startIdx, length) { + let match = content.slice(0, startIdx).match(NOT_DIACRITIC_FROM_END_REG_EXP); + if (match) { + const first = content.charCodeAt(startIdx); + const limit = match[1].charCodeAt(0); + if (getCharacterType(first) === getCharacterType(limit)) { + return false; + } + } + match = content.slice(startIdx + length).match(NOT_DIACRITIC_FROM_START_REG_EXP); + if (match) { + const last = content.charCodeAt(startIdx + length - 1); + const limit = match[1].charCodeAt(0); + if (getCharacterType(last) === getCharacterType(limit)) { + return false; + } + } + return true; + } + #convertToRegExpString(query, hasDiacritics) { + const { + matchDiacritics + } = this.#state; + let isUnicode = false; + query = query.replaceAll(SPECIAL_CHARS_REG_EXP, (match, p1, p2, p3, p4, p5) => { + if (p1) { + return `[ ]*\\${p1}[ ]*`; + } + if (p2) { + return `[ ]*${p2}[ ]*`; + } + if (p3) { + return "[ ]+"; + } + if (matchDiacritics) { + return p4 || p5; + } + if (p4) { + return DIACRITICS_EXCEPTION.has(p4.charCodeAt(0)) ? p4 : ""; + } + if (hasDiacritics) { + isUnicode = true; + return `${p5}\\p{M}*`; + } + return p5; + }); + const trailingSpaces = "[ ]*"; + if (query.endsWith(trailingSpaces)) { + query = query.slice(0, query.length - trailingSpaces.length); + } + if (matchDiacritics) { + if (hasDiacritics) { + DIACRITICS_EXCEPTION_STR ||= String.fromCharCode(...DIACRITICS_EXCEPTION); + isUnicode = true; + query = `${query}(?=[${DIACRITICS_EXCEPTION_STR}]|[^\\p{M}]|$)`; + } + } + return [isUnicode, query]; + } + #calculateMatch(pageIndex) { + if (!this.#state) { + return; + } + const query = this.#query; + if (query.length === 0) { + return; + } + const pageContent = this._pageContents[pageIndex]; + const matcherResult = this.match(query, pageContent, pageIndex); + const matches = this._pageMatches[pageIndex] = []; + const matchesLength = this._pageMatchesLength[pageIndex] = []; + const diffs = this._pageDiffs[pageIndex]; + matcherResult?.forEach(({ + index, + length + }) => { + const [matchPos, matchLen] = getOriginalIndex(diffs, index, length); + if (matchLen) { + matches.push(matchPos); + matchesLength.push(matchLen); + } + }); + if (this.#state.highlightAll) { + this.#updatePage(pageIndex); + } + if (this._resumePageIdx === pageIndex) { + this._resumePageIdx = null; + this.#nextPageMatch(); + } + const pageMatchesCount = matches.length; + this._matchesCountTotal += pageMatchesCount; + if (this.#updateMatchesCountOnProgress) { + if (pageMatchesCount > 0) { + this.#updateUIResultsCount(); + } + } else if (++this.#visitedPagesCount === this._linkService.pagesCount) { + this.#updateUIResultsCount(); + } + } + match(query, pageContent, pageIndex) { + const hasDiacritics = this._hasDiacritics[pageIndex]; + let isUnicode = false; + if (typeof query === "string") { + [isUnicode, query] = this.#convertToRegExpString(query, hasDiacritics); + } else { + query = query.sort().reverse().map(q => { + const [isUnicodePart, queryPart] = this.#convertToRegExpString(q, hasDiacritics); + isUnicode ||= isUnicodePart; + return `(${queryPart})`; + }).join("|"); + } + if (!query) { + return undefined; + } + const { + caseSensitive, + entireWord + } = this.#state; + const flags = `g${isUnicode ? "u" : ""}${caseSensitive ? "" : "i"}`; + query = new RegExp(query, flags); + const matches = []; + let match; + while ((match = query.exec(pageContent)) !== null) { + if (entireWord && !this.#isEntireWord(pageContent, match.index, match[0].length)) { + continue; + } + matches.push({ + index: match.index, + length: match[0].length + }); + } + return matches; + } + #extractText() { + if (this._extractTextPromises.length > 0) { + return; + } + let deferred = Promise.resolve(); + const textOptions = { + disableNormalization: true + }; + const pdfDoc = this._pdfDocument; + for (let i = 0, ii = this._linkService.pagesCount; i < ii; i++) { + const { + promise, + resolve + } = Promise.withResolvers(); + this._extractTextPromises[i] = promise; + deferred = deferred.then(async () => { + if (pdfDoc !== this._pdfDocument) { + resolve(); + return; + } + await pdfDoc.getPage(i + 1).then(pdfPage => pdfPage.getTextContent(textOptions)).then(textContent => { + const strBuf = []; + for (const textItem of textContent.items) { + strBuf.push(textItem.str); + if (textItem.hasEOL) { + strBuf.push("\n"); + } + } + [this._pageContents[i], this._pageDiffs[i], this._hasDiacritics[i]] = normalize(strBuf.join("")); + resolve(); + }, reason => { + console.error(`Unable to get text content for page ${i + 1}`, reason); + this._pageContents[i] = ""; + this._pageDiffs[i] = null; + this._hasDiacritics[i] = false; + resolve(); + }); + }); + } + } + #updatePage(index) { + if (this._scrollMatches && this._selected.pageIdx === index) { + this._linkService.page = index + 1; + } + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: index + }); + } + #updateAllPages() { + this._eventBus.dispatch("updatetextlayermatches", { + source: this, + pageIndex: -1 + }); + } + #nextMatch() { + const previous = this.#state.findPrevious; + const currentPageIndex = this._linkService.page - 1; + const numPages = this._linkService.pagesCount; + this._highlightMatches = true; + if (this._dirtyMatch) { + this._dirtyMatch = false; + this._selected.pageIdx = this._selected.matchIdx = -1; + this._offset.pageIdx = currentPageIndex; + this._offset.matchIdx = null; + this._offset.wrapped = false; + this._resumePageIdx = null; + this._pageMatches.length = 0; + this._pageMatchesLength.length = 0; + this.#visitedPagesCount = 0; + this._matchesCountTotal = 0; + this.#updateAllPages(); + for (let i = 0; i < numPages; i++) { + if (this._pendingFindMatches.has(i)) { + continue; + } + this._pendingFindMatches.add(i); + this._extractTextPromises[i].then(() => { + this._pendingFindMatches.delete(i); + this.#calculateMatch(i); + }); + } + } + const query = this.#query; + if (query.length === 0) { + this.#updateUIState(FindState.FOUND); + return; + } + if (this._resumePageIdx) { + return; + } + const offset = this._offset; + this._pagesToSearch = numPages; + if (offset.matchIdx !== null) { + const numPageMatches = this._pageMatches[offset.pageIdx].length; + if (!previous && offset.matchIdx + 1 < numPageMatches || previous && offset.matchIdx > 0) { + offset.matchIdx = previous ? offset.matchIdx - 1 : offset.matchIdx + 1; + this.#updateMatch(true); + return; + } + this.#advanceOffsetPage(previous); + } + this.#nextPageMatch(); + } + #matchesReady(matches) { + const offset = this._offset; + const numMatches = matches.length; + const previous = this.#state.findPrevious; + if (numMatches) { + offset.matchIdx = previous ? numMatches - 1 : 0; + this.#updateMatch(true); + return true; + } + this.#advanceOffsetPage(previous); + if (offset.wrapped) { + offset.matchIdx = null; + if (this._pagesToSearch < 0) { + this.#updateMatch(false); + return true; + } + } + return false; + } + #nextPageMatch() { + if (this._resumePageIdx !== null) { + console.error("There can only be one pending page."); + } + let matches = null; + do { + const pageIdx = this._offset.pageIdx; + matches = this._pageMatches[pageIdx]; + if (!matches) { + this._resumePageIdx = pageIdx; + break; + } + } while (!this.#matchesReady(matches)); + } + #advanceOffsetPage(previous) { + const offset = this._offset; + const numPages = this._linkService.pagesCount; + offset.pageIdx = previous ? offset.pageIdx - 1 : offset.pageIdx + 1; + offset.matchIdx = null; + this._pagesToSearch--; + if (offset.pageIdx >= numPages || offset.pageIdx < 0) { + offset.pageIdx = previous ? numPages - 1 : 0; + offset.wrapped = true; + } + } + #updateMatch(found = false) { + let state = FindState.NOT_FOUND; + const wrapped = this._offset.wrapped; + this._offset.wrapped = false; + if (found) { + const previousPage = this._selected.pageIdx; + this._selected.pageIdx = this._offset.pageIdx; + this._selected.matchIdx = this._offset.matchIdx; + state = wrapped ? FindState.WRAPPED : FindState.FOUND; + if (previousPage !== -1 && previousPage !== this._selected.pageIdx) { + this.#updatePage(previousPage); + } + } + this.#updateUIState(state, this.#state.findPrevious); + if (this._selected.pageIdx !== -1) { + this._scrollMatches = true; + this.#updatePage(this._selected.pageIdx); + } + } + #onFindBarClose(evt) { + const pdfDocument = this._pdfDocument; + this._firstPageCapability.promise.then(() => { + if (!this._pdfDocument || pdfDocument && this._pdfDocument !== pdfDocument) { + return; + } + if (this._findTimeout) { + clearTimeout(this._findTimeout); + this._findTimeout = null; + } + if (this._resumePageIdx) { + this._resumePageIdx = null; + this._dirtyMatch = true; + } + this.#updateUIState(FindState.FOUND); + this._highlightMatches = false; + this.#updateAllPages(); + }); + } + #requestMatchesCount() { + const { + pageIdx, + matchIdx + } = this._selected; + let current = 0, + total = this._matchesCountTotal; + if (matchIdx !== -1) { + for (let i = 0; i < pageIdx; i++) { + current += this._pageMatches[i]?.length || 0; + } + current += matchIdx + 1; + } + if (current < 1 || current > total) { + current = total = 0; + } + return { + current, + total + }; + } + #updateUIResultsCount() { + this._eventBus.dispatch("updatefindmatchescount", { + source: this, + matchesCount: this.#requestMatchesCount() + }); + } + #updateUIState(state, previous = false) { + if (!this.#updateMatchesCountOnProgress && (this.#visitedPagesCount !== this._linkService.pagesCount || state === FindState.PENDING)) { + return; + } + this._eventBus.dispatch("updatefindcontrolstate", { + source: this, + state, + previous, + entireWord: this.#state?.entireWord ?? null, + matchesCount: this.#requestMatchesCount(), + rawQuery: this.#state?.query ?? null + }); + } +} + +;// ./web/pdf_find_bar.js + + +const MATCHES_COUNT_LIMIT = 1000; +class PDFFindBar { + #mainContainer; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + constructor(options, mainContainer, eventBus) { + this.opened = false; + this.bar = options.bar; + this.toggleButton = options.toggleButton; + this.findField = options.findField; + this.highlightAll = options.highlightAllCheckbox; + this.caseSensitive = options.caseSensitiveCheckbox; + this.matchDiacritics = options.matchDiacriticsCheckbox; + this.entireWord = options.entireWordCheckbox; + this.findMsg = options.findMsg; + this.findResultsCount = options.findResultsCount; + this.findPreviousButton = options.findPreviousButton; + this.findNextButton = options.findNextButton; + this.eventBus = eventBus; + this.#mainContainer = mainContainer; + const checkedInputs = new Map([[this.highlightAll, "highlightallchange"], [this.caseSensitive, "casesensitivitychange"], [this.entireWord, "entirewordchange"], [this.matchDiacritics, "diacriticmatchingchange"]]); + this.toggleButton.addEventListener("click", () => { + this.toggle(); + }); + this.findField.addEventListener("input", () => { + this.dispatchEvent(""); + }); + this.bar.addEventListener("keydown", ({ + keyCode, + shiftKey, + target + }) => { + switch (keyCode) { + case 13: + if (target === this.findField) { + this.dispatchEvent("again", shiftKey); + } else if (checkedInputs.has(target)) { + target.checked = !target.checked; + this.dispatchEvent(checkedInputs.get(target)); + } + break; + case 27: + this.close(); + break; + } + }); + this.findPreviousButton.addEventListener("click", () => { + this.dispatchEvent("again", true); + }); + this.findNextButton.addEventListener("click", () => { + this.dispatchEvent("again", false); + }); + for (const [elem, evtName] of checkedInputs) { + elem.addEventListener("click", () => { + this.dispatchEvent(evtName); + }); + } + } + reset() { + this.updateUIState(); + } + dispatchEvent(type, findPrev = false) { + this.eventBus.dispatch("find", { + source: this, + type, + query: this.findField.value, + caseSensitive: this.caseSensitive.checked, + entireWord: this.entireWord.checked, + highlightAll: this.highlightAll.checked, + findPrevious: findPrev, + matchDiacritics: this.matchDiacritics.checked + }); + } + updateUIState(state, previous, matchesCount) { + const { + findField, + findMsg + } = this; + let findMsgId = "", + status = ""; + switch (state) { + case FindState.FOUND: + break; + case FindState.PENDING: + status = "pending"; + break; + case FindState.NOT_FOUND: + findMsgId = "pdfjs-find-not-found"; + status = "notFound"; + break; + case FindState.WRAPPED: + findMsgId = previous ? "pdfjs-find-reached-top" : "pdfjs-find-reached-bottom"; + break; + } + findField.setAttribute("data-status", status); + findField.setAttribute("aria-invalid", state === FindState.NOT_FOUND); + findMsg.setAttribute("data-status", status); + if (findMsgId) { + findMsg.setAttribute("data-l10n-id", findMsgId); + } else { + findMsg.removeAttribute("data-l10n-id"); + findMsg.textContent = ""; + } + this.updateResultsCount(matchesCount); + } + updateResultsCount({ + current = 0, + total = 0 + } = {}) { + const { + findResultsCount + } = this; + if (total > 0) { + const limit = MATCHES_COUNT_LIMIT; + findResultsCount.setAttribute("data-l10n-id", total > limit ? "pdfjs-find-match-count-limit" : "pdfjs-find-match-count"); + findResultsCount.setAttribute("data-l10n-args", JSON.stringify({ + limit, + current, + total + })); + } else { + findResultsCount.removeAttribute("data-l10n-id"); + findResultsCount.textContent = ""; + } + } + open() { + if (!this.opened) { + this.#resizeObserver.observe(this.#mainContainer); + this.#resizeObserver.observe(this.bar); + this.opened = true; + toggleExpandedBtn(this.toggleButton, true, this.bar); + } + this.findField.select(); + this.findField.focus(); + } + close() { + if (!this.opened) { + return; + } + this.#resizeObserver.disconnect(); + this.opened = false; + toggleExpandedBtn(this.toggleButton, false, this.bar); + this.eventBus.dispatch("findbarclose", { + source: this + }); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } + #resizeObserverCallback() { + const { + bar + } = this; + bar.classList.remove("wrapContainers"); + const findbarHeight = bar.clientHeight; + const inputContainerHeight = bar.firstElementChild.clientHeight; + if (findbarHeight > inputContainerHeight) { + bar.classList.add("wrapContainers"); + } + } +} + +;// ./web/pdf_history.js + + + +const HASH_CHANGE_TIMEOUT = 1000; +const POSITION_UPDATED_THRESHOLD = 50; +const UPDATE_VIEWAREA_TIMEOUT = 1000; +function getCurrentHash() { + return document.location.hash; +} +class PDFHistory { + #eventAbortController = null; + constructor({ + linkService, + eventBus + }) { + this.linkService = linkService; + this.eventBus = eventBus; + this._initialized = false; + this._fingerprint = ""; + this.reset(); + this.eventBus._on("pagesinit", () => { + this._isPagesLoaded = false; + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + }, { + once: true + }); + }); + } + initialize({ + fingerprint, + resetHistory = false, + updateUrl = false + }) { + if (!fingerprint || typeof fingerprint !== "string") { + console.error('PDFHistory.initialize: The "fingerprint" must be a non-empty string.'); + return; + } + if (this._initialized) { + this.reset(); + } + const reInitialized = this._fingerprint !== "" && this._fingerprint !== fingerprint; + this._fingerprint = fingerprint; + this._updateUrl = updateUrl === true; + this._initialized = true; + this.#bindEvents(); + const state = window.history.state; + this._popStateInProgress = false; + this._blockHashChange = 0; + this._currentHash = getCurrentHash(); + this._numPositionUpdates = 0; + this._uid = this._maxUid = 0; + this._destination = null; + this._position = null; + if (!this.#isValidState(state, true) || resetHistory) { + const { + hash, + page, + rotation + } = this.#parseCurrentHash(true); + if (!hash || reInitialized || resetHistory) { + this.#pushOrReplaceState(null, true); + return; + } + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (destination.rotation !== undefined) { + this._initialRotation = destination.rotation; + } + if (destination.dest) { + this._initialBookmark = JSON.stringify(destination.dest); + this._destination.page = null; + } else if (destination.hash) { + this._initialBookmark = destination.hash; + } else if (destination.page) { + this._initialBookmark = `page=${destination.page}`; + } + } + reset() { + if (this._initialized) { + this.#pageHide(); + this._initialized = false; + this.#unbindEvents(); + } + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._initialBookmark = null; + this._initialRotation = null; + } + push({ + namedDest = null, + explicitDest, + pageNumber + }) { + if (!this._initialized) { + return; + } + if (namedDest && typeof namedDest !== "string") { + console.error("PDFHistory.push: " + `"${namedDest}" is not a valid namedDest parameter.`); + return; + } else if (!Array.isArray(explicitDest)) { + console.error("PDFHistory.push: " + `"${explicitDest}" is not a valid explicitDest parameter.`); + return; + } else if (!this.#isValidPage(pageNumber)) { + if (pageNumber !== null || this._destination) { + console.error("PDFHistory.push: " + `"${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + } + const hash = namedDest || JSON.stringify(explicitDest); + if (!hash) { + return; + } + let forceReplace = false; + if (this._destination && (isDestHashesEqual(this._destination.hash, hash) || isDestArraysEqual(this._destination.dest, explicitDest))) { + if (this._destination.page) { + return; + } + forceReplace = true; + } + if (this._popStateInProgress && !forceReplace) { + return; + } + this.#pushOrReplaceState({ + dest: explicitDest, + hash, + page: pageNumber, + rotation: this.linkService.rotation + }, forceReplace); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushPage(pageNumber) { + if (!this._initialized) { + return; + } + if (!this.#isValidPage(pageNumber)) { + console.error(`PDFHistory.pushPage: "${pageNumber}" is not a valid page number.`); + return; + } + if (this._destination?.page === pageNumber) { + return; + } + if (this._popStateInProgress) { + return; + } + this.#pushOrReplaceState({ + dest: null, + hash: `page=${pageNumber}`, + page: pageNumber, + rotation: this.linkService.rotation + }); + if (!this._popStateInProgress) { + this._popStateInProgress = true; + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + } + pushCurrentPosition() { + if (!this._initialized || this._popStateInProgress) { + return; + } + this.#tryPushCurrentPosition(); + } + back() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid > 0) { + window.history.back(); + } + } + forward() { + if (!this._initialized || this._popStateInProgress) { + return; + } + const state = window.history.state; + if (this.#isValidState(state) && state.uid < this._maxUid) { + window.history.forward(); + } + } + get popStateInProgress() { + return this._initialized && (this._popStateInProgress || this._blockHashChange > 0); + } + get initialBookmark() { + return this._initialized ? this._initialBookmark : null; + } + get initialRotation() { + return this._initialized ? this._initialRotation : null; + } + #pushOrReplaceState(destination, forceReplace = false) { + const shouldReplace = forceReplace || !this._destination; + const newState = { + fingerprint: this._fingerprint, + uid: shouldReplace ? this._uid : this._uid + 1, + destination + }; + this.#updateInternalState(destination, newState.uid); + let newUrl; + if (this._updateUrl && destination?.hash) { + const { + href, + protocol + } = document.location; + if (protocol !== "file:") { + newUrl = updateUrlHash(href, destination.hash); + } + } + if (shouldReplace) { + window.history.replaceState(newState, "", newUrl); + } else { + window.history.pushState(newState, "", newUrl); + } + } + #tryPushCurrentPosition(temporary = false) { + if (!this._position) { + return; + } + let position = this._position; + if (temporary) { + position = Object.assign(Object.create(null), this._position); + position.temporary = true; + } + if (!this._destination) { + this.#pushOrReplaceState(position); + return; + } + if (this._destination.temporary) { + this.#pushOrReplaceState(position, true); + return; + } + if (this._destination.hash === position.hash) { + return; + } + if (!this._destination.page && (POSITION_UPDATED_THRESHOLD <= 0 || this._numPositionUpdates <= POSITION_UPDATED_THRESHOLD)) { + return; + } + let forceReplace = false; + if (this._destination.page >= position.first && this._destination.page <= position.page) { + if (this._destination.dest !== undefined || !this._destination.first) { + return; + } + forceReplace = true; + } + this.#pushOrReplaceState(position, forceReplace); + } + #isValidPage(val) { + return Number.isInteger(val) && val > 0 && val <= this.linkService.pagesCount; + } + #isValidState(state, checkReload = false) { + if (!state) { + return false; + } + if (state.fingerprint !== this._fingerprint) { + if (checkReload) { + if (typeof state.fingerprint !== "string" || state.fingerprint.length !== this._fingerprint.length) { + return false; + } + const [perfEntry] = performance.getEntriesByType("navigation"); + if (perfEntry?.type !== "reload") { + return false; + } + } else { + return false; + } + } + if (!Number.isInteger(state.uid) || state.uid < 0) { + return false; + } + if (state.destination === null || typeof state.destination !== "object") { + return false; + } + return true; + } + #updateInternalState(destination, uid, removeTemporary = false) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + if (removeTemporary && destination?.temporary) { + delete destination.temporary; + } + this._destination = destination; + this._uid = uid; + this._maxUid = Math.max(this._maxUid, uid); + this._numPositionUpdates = 0; + } + #parseCurrentHash(checkNameddest = false) { + const hash = unescape(getCurrentHash()).substring(1); + const params = parseQueryString(hash); + const nameddest = params.get("nameddest") || ""; + let page = params.get("page") | 0; + if (!this.#isValidPage(page) || checkNameddest && nameddest.length > 0) { + page = null; + } + return { + hash, + page, + rotation: this.linkService.rotation + }; + } + #updateViewarea({ + location + }) { + if (this._updateViewareaTimeout) { + clearTimeout(this._updateViewareaTimeout); + this._updateViewareaTimeout = null; + } + this._position = { + hash: location.pdfOpenParams.substring(1), + page: this.linkService.page, + first: location.pageNumber, + rotation: location.rotation + }; + if (this._popStateInProgress) { + return; + } + if (POSITION_UPDATED_THRESHOLD > 0 && this._isPagesLoaded && this._destination && !this._destination.page) { + this._numPositionUpdates++; + } + if (UPDATE_VIEWAREA_TIMEOUT > 0) { + this._updateViewareaTimeout = setTimeout(() => { + if (!this._popStateInProgress) { + this.#tryPushCurrentPosition(true); + } + this._updateViewareaTimeout = null; + }, UPDATE_VIEWAREA_TIMEOUT); + } + } + #popState({ + state + }) { + const newHash = getCurrentHash(), + hashChanged = this._currentHash !== newHash; + this._currentHash = newHash; + if (!state) { + this._uid++; + const { + hash, + page, + rotation + } = this.#parseCurrentHash(); + this.#pushOrReplaceState({ + hash, + page, + rotation + }, true); + return; + } + if (!this.#isValidState(state)) { + return; + } + this._popStateInProgress = true; + if (hashChanged) { + this._blockHashChange++; + waitOnEventOrTimeout({ + target: window, + name: "hashchange", + delay: HASH_CHANGE_TIMEOUT + }).then(() => { + this._blockHashChange--; + }); + } + const destination = state.destination; + this.#updateInternalState(destination, state.uid, true); + if (isValidRotation(destination.rotation)) { + this.linkService.rotation = destination.rotation; + } + if (destination.dest) { + this.linkService.goToDestination(destination.dest); + } else if (destination.hash) { + this.linkService.setHash(destination.hash); + } else if (destination.page) { + this.linkService.page = destination.page; + } + Promise.resolve().then(() => { + this._popStateInProgress = false; + }); + } + #pageHide() { + if (!this._destination || this._destination.temporary) { + this.#tryPushCurrentPosition(); + } + } + #bindEvents() { + if (this.#eventAbortController) { + return; + } + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + this.eventBus._on("updateviewarea", this.#updateViewarea.bind(this), { + signal + }); + window.addEventListener("popstate", this.#popState.bind(this), { + signal + }); + window.addEventListener("pagehide", this.#pageHide.bind(this), { + signal + }); + } + #unbindEvents() { + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } +} +function isDestHashesEqual(destHash, pushHash) { + if (typeof destHash !== "string" || typeof pushHash !== "string") { + return false; + } + if (destHash === pushHash) { + return true; + } + const nameddest = parseQueryString(destHash).get("nameddest"); + if (nameddest === pushHash) { + return true; + } + return false; +} +function isDestArraysEqual(firstDest, secondDest) { + function isEntryEqual(first, second) { + if (typeof first !== typeof second) { + return false; + } + if (Array.isArray(first) || Array.isArray(second)) { + return false; + } + if (first !== null && typeof first === "object" && second !== null) { + if (Object.keys(first).length !== Object.keys(second).length) { + return false; + } + for (const key in first) { + if (!isEntryEqual(first[key], second[key])) { + return false; + } + } + return true; + } + return first === second || Number.isNaN(first) && Number.isNaN(second); + } + if (!(Array.isArray(firstDest) && Array.isArray(secondDest))) { + return false; + } + if (firstDest.length !== secondDest.length) { + return false; + } + for (let i = 0, ii = firstDest.length; i < ii; i++) { + if (!isEntryEqual(firstDest[i], secondDest[i])) { + return false; + } + } + return true; +} + +;// ./web/pdf_layer_viewer.js + +class PDFLayerViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.eventBus._on("optionalcontentconfigchanged", evt => { + this.#updateLayers(evt.promise); + }); + this.eventBus._on("resetlayers", () => { + this.#updateLayers(); + }); + this.eventBus._on("togglelayerstree", this._toggleAllTreeItems.bind(this)); + } + reset() { + super.reset(); + this._optionalContentConfig = null; + this._optionalContentVisibility?.clear(); + this._optionalContentVisibility = null; + } + _dispatchEvent(layersCount) { + this.eventBus.dispatch("layersloaded", { + source: this, + layersCount + }); + } + _bindLink(element, { + groupId, + input + }) { + const setVisibility = () => { + const visible = input.checked; + this._optionalContentConfig.setVisibility(groupId, visible); + const cached = this._optionalContentVisibility.get(groupId); + if (cached) { + cached.visible = visible; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(this._optionalContentConfig) + }); + }; + element.onclick = evt => { + if (evt.target === input) { + setVisibility(); + return true; + } else if (evt.target !== element) { + return true; + } + input.checked = !input.checked; + setVisibility(); + return false; + }; + } + _setNestedName(element, { + name = null + }) { + if (typeof name === "string") { + element.textContent = this._normalizeTextContent(name); + return; + } + element.setAttribute("data-l10n-id", "pdfjs-additional-layers"); + element.style.fontStyle = "italic"; + this._l10n.translateOnce(element); + } + _addToggleButton(div, { + name = null + }) { + super._addToggleButton(div, name === null); + } + _toggleAllTreeItems() { + if (!this._optionalContentConfig) { + return; + } + super._toggleAllTreeItems(); + } + render({ + optionalContentConfig, + pdfDocument + }) { + if (this._optionalContentConfig) { + this.reset(); + } + this._optionalContentConfig = optionalContentConfig || null; + this._pdfDocument = pdfDocument || null; + const groups = optionalContentConfig?.getOrder(); + if (!groups) { + this._dispatchEvent(0); + return; + } + this._optionalContentVisibility = new Map(); + const fragment = document.createDocumentFragment(), + queue = [{ + parent: fragment, + groups + }]; + let layersCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const groupId of levelData.groups) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + div.append(element); + if (typeof groupId === "object") { + hasAnyNesting = true; + this._addToggleButton(div, groupId); + this._setNestedName(element, groupId); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + groups: groupId.order + }); + } else { + const group = optionalContentConfig.getGroup(groupId); + const input = document.createElement("input"); + this._bindLink(element, { + groupId, + input + }); + input.type = "checkbox"; + input.checked = group.visible; + this._optionalContentVisibility.set(groupId, { + input, + visible: input.checked + }); + const label = document.createElement("label"); + label.textContent = this._normalizeTextContent(group.name); + label.append(input); + element.append(label); + layersCount++; + } + levelData.parent.append(div); + } + } + this._finishRendering(fragment, layersCount, hasAnyNesting); + } + async #updateLayers(promise = null) { + if (!this._optionalContentConfig) { + return; + } + const pdfDocument = this._pdfDocument; + const optionalContentConfig = await (promise || pdfDocument.getOptionalContentConfig({ + intent: "display" + })); + if (pdfDocument !== this._pdfDocument) { + return; + } + if (promise) { + for (const [groupId, cached] of this._optionalContentVisibility) { + const group = optionalContentConfig.getGroup(groupId); + if (group && cached.visible !== group.visible) { + cached.input.checked = cached.visible = !cached.visible; + } + } + return; + } + this.eventBus.dispatch("optionalcontentconfig", { + source: this, + promise: Promise.resolve(optionalContentConfig) + }); + this.render({ + optionalContentConfig, + pdfDocument: this._pdfDocument + }); + } +} + +;// ./web/pdf_outline_viewer.js + + +class PDFOutlineViewer extends BaseTreeViewer { + constructor(options) { + super(options); + this.linkService = options.linkService; + this.downloadManager = options.downloadManager; + this.eventBus._on("toggleoutlinetree", this._toggleAllTreeItems.bind(this)); + this.eventBus._on("currentoutlineitem", this._currentOutlineItem.bind(this)); + this.eventBus._on("pagechanging", evt => { + this._currentPageNumber = evt.pageNumber; + }); + this.eventBus._on("pagesloaded", evt => { + this._isPagesLoaded = !!evt.pagesCount; + this._currentOutlineItemCapability?.resolve(this._isPagesLoaded); + }); + this.eventBus._on("sidebarviewchanged", evt => { + this._sidebarView = evt.view; + }); + } + reset() { + super.reset(); + this._outline = null; + this._pageNumberToDestHashCapability = null; + this._currentPageNumber = 1; + this._isPagesLoaded = null; + this._currentOutlineItemCapability?.resolve(false); + this._currentOutlineItemCapability = null; + } + _dispatchEvent(outlineCount) { + this._currentOutlineItemCapability = Promise.withResolvers(); + if (outlineCount === 0 || this._pdfDocument?.loadingParams.disableAutoFetch) { + this._currentOutlineItemCapability.resolve(false); + } else if (this._isPagesLoaded !== null) { + this._currentOutlineItemCapability.resolve(this._isPagesLoaded); + } + this.eventBus.dispatch("outlineloaded", { + source: this, + outlineCount, + currentOutlineItemPromise: this._currentOutlineItemCapability.promise + }); + } + _bindLink(element, { + url, + newWindow, + action, + attachment, + dest, + setOCGState + }) { + const { + linkService + } = this; + if (url) { + linkService.addLinkAttributes(element, url, newWindow); + return; + } + if (action) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeNamedAction(action); + return false; + }; + return; + } + if (attachment) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + this.downloadManager.openOrDownloadData(attachment.content, attachment.filename); + return false; + }; + return; + } + if (setOCGState) { + element.href = linkService.getAnchorUrl(""); + element.onclick = () => { + linkService.executeSetOCGState(setOCGState); + return false; + }; + return; + } + element.href = linkService.getDestinationHash(dest); + element.onclick = evt => { + this._updateCurrentTreeItem(evt.target.parentNode); + if (dest) { + linkService.goToDestination(dest); + } + return false; + }; + } + _setStyles(element, { + bold, + italic + }) { + if (bold) { + element.style.fontWeight = "bold"; + } + if (italic) { + element.style.fontStyle = "italic"; + } + } + _addToggleButton(div, { + count, + items + }) { + let hidden = false; + if (count < 0) { + let totalCount = items.length; + if (totalCount > 0) { + const queue = [...items]; + while (queue.length > 0) { + const { + count: nestedCount, + items: nestedItems + } = queue.shift(); + if (nestedCount > 0 && nestedItems.length > 0) { + totalCount += nestedItems.length; + queue.push(...nestedItems); + } + } + } + if (Math.abs(count) === totalCount) { + hidden = true; + } + } + super._addToggleButton(div, hidden); + } + _toggleAllTreeItems() { + if (!this._outline) { + return; + } + super._toggleAllTreeItems(); + } + render({ + outline, + pdfDocument + }) { + if (this._outline) { + this.reset(); + } + this._outline = outline || null; + this._pdfDocument = pdfDocument || null; + if (!outline) { + this._dispatchEvent(0); + return; + } + const fragment = document.createDocumentFragment(); + const queue = [{ + parent: fragment, + items: outline + }]; + let outlineCount = 0, + hasAnyNesting = false; + while (queue.length > 0) { + const levelData = queue.shift(); + for (const item of levelData.items) { + const div = document.createElement("div"); + div.className = "treeItem"; + const element = document.createElement("a"); + this._bindLink(element, item); + this._setStyles(element, item); + element.textContent = this._normalizeTextContent(item.title); + div.append(element); + if (item.items.length > 0) { + hasAnyNesting = true; + this._addToggleButton(div, item); + const itemsDiv = document.createElement("div"); + itemsDiv.className = "treeItems"; + div.append(itemsDiv); + queue.push({ + parent: itemsDiv, + items: item.items + }); + } + levelData.parent.append(div); + outlineCount++; + } + } + this._finishRendering(fragment, outlineCount, hasAnyNesting); + } + async _currentOutlineItem() { + if (!this._isPagesLoaded) { + throw new Error("_currentOutlineItem: All pages have not been loaded."); + } + if (!this._outline || !this._pdfDocument) { + return; + } + const pageNumberToDestHash = await this._getPageNumberToDestHash(this._pdfDocument); + if (!pageNumberToDestHash) { + return; + } + this._updateCurrentTreeItem(null); + if (this._sidebarView !== SidebarView.OUTLINE) { + return; + } + for (let i = this._currentPageNumber; i > 0; i--) { + const destHash = pageNumberToDestHash.get(i); + if (!destHash) { + continue; + } + const linkElement = this.container.querySelector(`a[href="${destHash}"]`); + if (!linkElement) { + continue; + } + this._scrollToCurrentTreeItem(linkElement.parentNode); + break; + } + } + async _getPageNumberToDestHash(pdfDocument) { + if (this._pageNumberToDestHashCapability) { + return this._pageNumberToDestHashCapability.promise; + } + this._pageNumberToDestHashCapability = Promise.withResolvers(); + const pageNumberToDestHash = new Map(), + pageNumberNesting = new Map(); + const queue = [{ + nesting: 0, + items: this._outline + }]; + while (queue.length > 0) { + const levelData = queue.shift(), + currentNesting = levelData.nesting; + for (const { + dest, + items + } of levelData.items) { + let explicitDest, pageNumber; + if (typeof dest === "string") { + explicitDest = await pdfDocument.getDestination(dest); + if (pdfDocument !== this._pdfDocument) { + return null; + } + } else { + explicitDest = dest; + } + if (Array.isArray(explicitDest)) { + const [destRef] = explicitDest; + if (destRef && typeof destRef === "object") { + pageNumber = pdfDocument.cachedPageNumber(destRef); + } else if (Number.isInteger(destRef)) { + pageNumber = destRef + 1; + } + if (Number.isInteger(pageNumber) && (!pageNumberToDestHash.has(pageNumber) || currentNesting > pageNumberNesting.get(pageNumber))) { + const destHash = this.linkService.getDestinationHash(dest); + pageNumberToDestHash.set(pageNumber, destHash); + pageNumberNesting.set(pageNumber, currentNesting); + } + } + if (items.length > 0) { + queue.push({ + nesting: currentNesting + 1, + items + }); + } + } + } + this._pageNumberToDestHashCapability.resolve(pageNumberToDestHash.size > 0 ? pageNumberToDestHash : null); + return this._pageNumberToDestHashCapability.promise; + } +} + +;// ./web/pdf_presentation_mode.js + + +const DELAY_BEFORE_HIDING_CONTROLS = 3000; +const ACTIVE_SELECTOR = "pdfPresentationMode"; +const CONTROLS_SELECTOR = "pdfPresentationModeControls"; +const MOUSE_SCROLL_COOLDOWN_TIME = 50; +const PAGE_SWITCH_THRESHOLD = 0.1; +const SWIPE_MIN_DISTANCE_THRESHOLD = 50; +const SWIPE_ANGLE_THRESHOLD = Math.PI / 6; +class PDFPresentationMode { + #state = PresentationModeState.UNKNOWN; + #args = null; + #fullscreenChangeAbortController = null; + #windowAbortController = null; + constructor({ + container, + pdfViewer, + eventBus + }) { + this.container = container; + this.pdfViewer = pdfViewer; + this.eventBus = eventBus; + this.contextMenuOpen = false; + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + this.touchSwipeState = null; + } + async request() { + const { + container, + pdfViewer + } = this; + if (this.active || !pdfViewer.pagesCount || !container.requestFullscreen) { + return false; + } + this.#addFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.CHANGING); + const promise = container.requestFullscreen(); + this.#args = { + pageNumber: pdfViewer.currentPageNumber, + scaleValue: pdfViewer.currentScaleValue, + scrollMode: pdfViewer.scrollMode, + spreadMode: null, + annotationEditorMode: null + }; + if (pdfViewer.spreadMode !== SpreadMode.NONE && !(pdfViewer.pageViewsReady && pdfViewer.hasEqualPageSizes)) { + console.warn("Ignoring Spread modes when entering PresentationMode, " + "since the document may contain varying page sizes."); + this.#args.spreadMode = pdfViewer.spreadMode; + } + if (pdfViewer.annotationEditorMode !== AnnotationEditorType.DISABLE) { + this.#args.annotationEditorMode = pdfViewer.annotationEditorMode; + } + try { + await promise; + pdfViewer.focus(); + return true; + } catch { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + } + return false; + } + get active() { + return this.#state === PresentationModeState.CHANGING || this.#state === PresentationModeState.FULLSCREEN; + } + #mouseWheel(evt) { + if (!this.active) { + return; + } + evt.preventDefault(); + const delta = normalizeWheelEventDelta(evt); + const currentTime = Date.now(); + const storedTime = this.mouseScrollTimeStamp; + if (currentTime > storedTime && currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) { + return; + } + if (this.mouseScrollDelta > 0 && delta < 0 || this.mouseScrollDelta < 0 && delta > 0) { + this.#resetMouseScrollState(); + } + this.mouseScrollDelta += delta; + if (Math.abs(this.mouseScrollDelta) >= PAGE_SWITCH_THRESHOLD) { + const totalDelta = this.mouseScrollDelta; + this.#resetMouseScrollState(); + const success = totalDelta > 0 ? this.pdfViewer.previousPage() : this.pdfViewer.nextPage(); + if (success) { + this.mouseScrollTimeStamp = currentTime; + } + } + } + #notifyStateChange(state) { + this.#state = state; + this.eventBus.dispatch("presentationmodechanged", { + source: this, + state + }); + } + #enter() { + this.#notifyStateChange(PresentationModeState.FULLSCREEN); + this.container.classList.add(ACTIVE_SELECTOR); + setTimeout(() => { + this.pdfViewer.scrollMode = ScrollMode.PAGE; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = SpreadMode.NONE; + } + this.pdfViewer.currentPageNumber = this.#args.pageNumber; + this.pdfViewer.currentScaleValue = "page-fit"; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: AnnotationEditorType.NONE + }; + } + }, 0); + this.#addWindowListeners(); + this.#showControls(); + this.contextMenuOpen = false; + document.getSelection().empty(); + } + #exit() { + const pageNumber = this.pdfViewer.currentPageNumber; + this.container.classList.remove(ACTIVE_SELECTOR); + setTimeout(() => { + this.#removeFullscreenChangeListeners(); + this.#notifyStateChange(PresentationModeState.NORMAL); + this.pdfViewer.scrollMode = this.#args.scrollMode; + if (this.#args.spreadMode !== null) { + this.pdfViewer.spreadMode = this.#args.spreadMode; + } + this.pdfViewer.currentScaleValue = this.#args.scaleValue; + this.pdfViewer.currentPageNumber = pageNumber; + if (this.#args.annotationEditorMode !== null) { + this.pdfViewer.annotationEditorMode = { + mode: this.#args.annotationEditorMode + }; + } + this.#args = null; + }, 0); + this.#removeWindowListeners(); + this.#hideControls(); + this.#resetMouseScrollState(); + this.contextMenuOpen = false; + } + #mouseDown(evt) { + if (this.contextMenuOpen) { + this.contextMenuOpen = false; + evt.preventDefault(); + return; + } + if (evt.button !== 0) { + return; + } + if (evt.target.href && evt.target.parentNode?.hasAttribute("data-internal-link")) { + return; + } + evt.preventDefault(); + if (evt.shiftKey) { + this.pdfViewer.previousPage(); + } else { + this.pdfViewer.nextPage(); + } + } + #contextMenu() { + this.contextMenuOpen = true; + } + #showControls() { + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + this.container.classList.add(CONTROLS_SELECTOR); + } + this.controlsTimeout = setTimeout(() => { + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + }, DELAY_BEFORE_HIDING_CONTROLS); + } + #hideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + this.container.classList.remove(CONTROLS_SELECTOR); + delete this.controlsTimeout; + } + #resetMouseScrollState() { + this.mouseScrollTimeStamp = 0; + this.mouseScrollDelta = 0; + } + #touchSwipe(evt) { + if (!this.active) { + return; + } + if (evt.touches.length > 1) { + this.touchSwipeState = null; + return; + } + switch (evt.type) { + case "touchstart": + this.touchSwipeState = { + startX: evt.touches[0].pageX, + startY: evt.touches[0].pageY, + endX: evt.touches[0].pageX, + endY: evt.touches[0].pageY + }; + break; + case "touchmove": + if (this.touchSwipeState === null) { + return; + } + this.touchSwipeState.endX = evt.touches[0].pageX; + this.touchSwipeState.endY = evt.touches[0].pageY; + evt.preventDefault(); + break; + case "touchend": + if (this.touchSwipeState === null) { + return; + } + let delta = 0; + const dx = this.touchSwipeState.endX - this.touchSwipeState.startX; + const dy = this.touchSwipeState.endY - this.touchSwipeState.startY; + const absAngle = Math.abs(Math.atan2(dy, dx)); + if (Math.abs(dx) > SWIPE_MIN_DISTANCE_THRESHOLD && (absAngle <= SWIPE_ANGLE_THRESHOLD || absAngle >= Math.PI - SWIPE_ANGLE_THRESHOLD)) { + delta = dx; + } else if (Math.abs(dy) > SWIPE_MIN_DISTANCE_THRESHOLD && Math.abs(absAngle - Math.PI / 2) <= SWIPE_ANGLE_THRESHOLD) { + delta = dy; + } + if (delta > 0) { + this.pdfViewer.previousPage(); + } else if (delta < 0) { + this.pdfViewer.nextPage(); + } + break; + } + } + #addWindowListeners() { + if (this.#windowAbortController) { + return; + } + this.#windowAbortController = new AbortController(); + const { + signal + } = this.#windowAbortController; + const touchSwipeBind = this.#touchSwipe.bind(this); + window.addEventListener("mousemove", this.#showControls.bind(this), { + signal + }); + window.addEventListener("mousedown", this.#mouseDown.bind(this), { + signal + }); + window.addEventListener("wheel", this.#mouseWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("keydown", this.#resetMouseScrollState.bind(this), { + signal + }); + window.addEventListener("contextmenu", this.#contextMenu.bind(this), { + signal + }); + window.addEventListener("touchstart", touchSwipeBind, { + signal + }); + window.addEventListener("touchmove", touchSwipeBind, { + signal + }); + window.addEventListener("touchend", touchSwipeBind, { + signal + }); + } + #removeWindowListeners() { + this.#windowAbortController?.abort(); + this.#windowAbortController = null; + } + #addFullscreenChangeListeners() { + if (this.#fullscreenChangeAbortController) { + return; + } + this.#fullscreenChangeAbortController = new AbortController(); + window.addEventListener("fullscreenchange", () => { + if (document.fullscreenElement) { + this.#enter(); + } else { + this.#exit(); + } + }, { + signal: this.#fullscreenChangeAbortController.signal + }); + } + #removeFullscreenChangeListeners() { + this.#fullscreenChangeAbortController?.abort(); + this.#fullscreenChangeAbortController = null; + } +} + +;// ./web/xfa_layer_builder.js + +class XfaLayerBuilder { + constructor({ + pdfPage, + annotationStorage = null, + linkService, + xfaHtml = null + }) { + this.pdfPage = pdfPage; + this.annotationStorage = annotationStorage; + this.linkService = linkService; + this.xfaHtml = xfaHtml; + this.div = null; + this._cancelled = false; + } + async render({ + viewport, + intent = "display" + }) { + if (intent === "print") { + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml: this.xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + const xfaHtml = await this.pdfPage.getXfa(); + if (this._cancelled || !xfaHtml) { + return { + textDivs: [] + }; + } + const parameters = { + viewport: viewport.clone({ + dontFlip: true + }), + div: this.div, + xfaHtml, + annotationStorage: this.annotationStorage, + linkService: this.linkService, + intent + }; + if (this.div) { + return XfaLayer.update(parameters); + } + this.div = document.createElement("div"); + parameters.div = this.div; + return XfaLayer.render(parameters); + } + cancel() { + this._cancelled = true; + } + hide() { + if (!this.div) { + return; + } + this.div.hidden = true; + } +} + +;// ./web/print_utils.js + + + +function getXfaHtmlForPrinting(printContainer, pdfDocument) { + const xfaHtml = pdfDocument.allXfaHtml; + const linkService = new SimpleLinkService(); + const scale = Math.round(PixelsPerInch.PDF_TO_CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { + const page = document.createElement("div"); + page.className = "xfaPrintedPage"; + printContainer.append(page); + const builder = new XfaLayerBuilder({ + pdfPage: null, + annotationStorage: pdfDocument.annotationStorage, + linkService, + xfaHtml: xfaPage + }); + const viewport = getXfaPageViewport(xfaPage, { + scale + }); + builder.render({ + viewport, + intent: "print" + }); + page.append(builder.div); + } +} + +;// ./web/pdf_print_service.js + + +let activeService = null; +let dialog = null; +let overlayManager = null; +let viewerApp = { + initialized: false +}; +function renderPage(activeServiceOnEntry, pdfDocument, pageNumber, size, printResolution, optionalContentConfigPromise, printAnnotationStoragePromise) { + const scratchCanvas = activeService.scratchCanvas; + const PRINT_UNITS = printResolution / PixelsPerInch.PDF; + scratchCanvas.width = Math.floor(size.width * PRINT_UNITS); + scratchCanvas.height = Math.floor(size.height * PRINT_UNITS); + const ctx = scratchCanvas.getContext("2d"); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, scratchCanvas.width, scratchCanvas.height); + ctx.restore(); + return Promise.all([pdfDocument.getPage(pageNumber), printAnnotationStoragePromise]).then(function ([pdfPage, printAnnotationStorage]) { + const renderContext = { + canvas: scratchCanvas, + transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], + viewport: pdfPage.getViewport({ + scale: 1, + rotation: size.rotation + }), + intent: "print", + annotationMode: AnnotationMode.ENABLE_STORAGE, + optionalContentConfigPromise, + printAnnotationStorage + }; + const renderTask = pdfPage.render(renderContext); + return renderTask.promise.catch(reason => { + if (!(reason instanceof RenderingCancelledException)) { + console.error(reason); + } + throw reason; + }); + }); +} +class PDFPrintService { + constructor({ + pdfDocument, + pagesOverview, + printContainer, + printResolution, + printAnnotationStoragePromise = null + }) { + this.pdfDocument = pdfDocument; + this.pagesOverview = pagesOverview; + this.printContainer = printContainer; + this._printResolution = printResolution || 150; + this._optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "print" + }); + this._printAnnotationStoragePromise = printAnnotationStoragePromise || Promise.resolve(); + this.currentPage = -1; + this.scratchCanvas = document.createElement("canvas"); + } + layout() { + this.throwIfInactive(); + const body = document.querySelector("body"); + body.setAttribute("data-pdfjsprinting", true); + const { + width, + height + } = this.pagesOverview[0]; + const hasEqualPageSizes = this.pagesOverview.every(size => size.width === width && size.height === height); + if (!hasEqualPageSizes) { + console.warn("Not all pages have the same size. The printed result may be incorrect!"); + } + this.pageStyleSheet = document.createElement("style"); + this.pageStyleSheet.textContent = `@page { size: ${width}pt ${height}pt;}`; + body.append(this.pageStyleSheet); + } + destroy() { + if (activeService !== this) { + return; + } + this.printContainer.textContent = ""; + const body = document.querySelector("body"); + body.removeAttribute("data-pdfjsprinting"); + if (this.pageStyleSheet) { + this.pageStyleSheet.remove(); + this.pageStyleSheet = null; + } + this.scratchCanvas.width = this.scratchCanvas.height = 0; + this.scratchCanvas = null; + activeService = null; + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } + renderPages() { + if (this.pdfDocument.isPureXfa) { + getXfaHtmlForPrinting(this.printContainer, this.pdfDocument); + return Promise.resolve(); + } + const pageCount = this.pagesOverview.length; + const renderNextPage = (resolve, reject) => { + this.throwIfInactive(); + if (++this.currentPage >= pageCount) { + renderProgress(pageCount, pageCount); + resolve(); + return; + } + const index = this.currentPage; + renderProgress(index, pageCount); + renderPage(this, this.pdfDocument, index + 1, this.pagesOverview[index], this._printResolution, this._optionalContentConfigPromise, this._printAnnotationStoragePromise).then(this.useRenderedPage.bind(this)).then(function () { + renderNextPage(resolve, reject); + }, reject); + }; + return new Promise(renderNextPage); + } + useRenderedPage() { + this.throwIfInactive(); + const img = document.createElement("img"); + this.scratchCanvas.toBlob(blob => { + img.src = URL.createObjectURL(blob); + }); + const wrapper = document.createElement("div"); + wrapper.className = "printedPage"; + wrapper.append(img); + this.printContainer.append(wrapper); + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + img.onload = resolve; + img.onerror = reject; + promise.catch(() => {}).then(() => { + URL.revokeObjectURL(img.src); + }); + return promise; + } + performPrint() { + this.throwIfInactive(); + return new Promise(resolve => { + setTimeout(() => { + if (!this.active) { + resolve(); + return; + } + print.call(window); + setTimeout(resolve, 20); + }, 0); + }); + } + get active() { + return this === activeService; + } + throwIfInactive() { + if (!this.active) { + throw new Error("This print request was cancelled or completed."); + } + } +} +const print = window.print; +window.print = function () { + if (activeService) { + console.warn("Ignored window.print() because of a pending print job."); + return; + } + ensureOverlay().then(function () { + if (activeService) { + overlayManager.open(dialog); + } + }); + try { + dispatchEvent("beforeprint"); + } finally { + if (!activeService) { + console.error("Expected print service to be initialized."); + ensureOverlay().then(function () { + overlayManager.closeIfActive(dialog); + }); + } else { + const activeServiceOnEntry = activeService; + activeService.renderPages().then(() => activeServiceOnEntry.performPrint()).catch(() => {}).then(() => { + if (activeServiceOnEntry.active) { + abort(); + } + }); + } + } +}; +function dispatchEvent(eventType) { + const event = new CustomEvent(eventType, { + bubbles: false, + cancelable: false, + detail: "custom" + }); + window.dispatchEvent(event); +} +function abort() { + if (activeService) { + activeService.destroy(); + dispatchEvent("afterprint"); + } +} +function renderProgress(index, total) { + dialog ||= document.getElementById("printServiceDialog"); + const progress = Math.round(100 * index / total); + const progressBar = dialog.querySelector("progress"); + const progressPerc = dialog.querySelector(".relative-progress"); + progressBar.value = progress; + progressPerc.setAttribute("data-l10n-args", JSON.stringify({ + progress + })); +} +window.addEventListener("keydown", function (event) { + if (event.keyCode === 80 && (event.ctrlKey || event.metaKey) && !event.altKey && (!event.shiftKey || window.chrome || window.opera)) { + window.print(); + event.preventDefault(); + event.stopImmediatePropagation(); + } +}, true); +if ("onbeforeprint" in window) { + const stopPropagationIfNeeded = function (event) { + if (event.detail !== "custom") { + event.stopImmediatePropagation(); + } + }; + window.addEventListener("beforeprint", stopPropagationIfNeeded); + window.addEventListener("afterprint", stopPropagationIfNeeded); +} +let overlayPromise; +function ensureOverlay() { + if (!overlayPromise) { + overlayManager = viewerApp.overlayManager; + if (!overlayManager) { + throw new Error("The overlay manager has not yet been initialized."); + } + dialog ||= document.getElementById("printServiceDialog"); + overlayPromise = overlayManager.register(dialog, true); + document.getElementById("printCancel").onclick = abort; + dialog.addEventListener("close", abort); + } + return overlayPromise; +} +class PDFPrintServiceFactory { + static initGlobals(app) { + viewerApp = app; + } + static get supportsPrinting() { + return shadow(this, "supportsPrinting", true); + } + static createPrintService(params) { + if (activeService) { + throw new Error("The print service is created and active."); + } + return activeService = new PDFPrintService(params); + } +} + +;// ./web/pdf_rendering_queue.js + + +const CLEANUP_TIMEOUT = 30000; +class PDFRenderingQueue { + constructor() { + this.pdfViewer = null; + this.pdfThumbnailViewer = null; + this.onIdle = null; + this.highestPriorityPage = null; + this.idleTimeout = null; + this.printing = false; + this.isThumbnailViewEnabled = false; + Object.defineProperty(this, "hasViewer", { + value: () => !!this.pdfViewer + }); + } + setViewer(pdfViewer) { + this.pdfViewer = pdfViewer; + } + setThumbnailViewer(pdfThumbnailViewer) { + this.pdfThumbnailViewer = pdfThumbnailViewer; + } + isHighestPriority(view) { + return this.highestPriorityPage === view.renderingId; + } + renderHighestPriority(currentlyVisiblePages) { + if (this.idleTimeout) { + clearTimeout(this.idleTimeout); + this.idleTimeout = null; + } + if (this.pdfViewer.forceRendering(currentlyVisiblePages)) { + return; + } + if (this.isThumbnailViewEnabled && this.pdfThumbnailViewer?.forceRendering()) { + return; + } + if (this.printing) { + return; + } + if (this.onIdle) { + this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT); + } + } + getHighestPriority(visible, views, scrolledDown, preRenderExtra = false, ignoreDetailViews = false) { + const visibleViews = visible.views, + numVisible = visibleViews.length; + if (numVisible === 0) { + return null; + } + for (let i = 0; i < numVisible; i++) { + const view = visibleViews[i].view; + if (!this.isViewFinished(view)) { + return view; + } + } + if (!ignoreDetailViews) { + for (let i = 0; i < numVisible; i++) { + const { + detailView + } = visibleViews[i].view; + if (detailView && !this.isViewFinished(detailView)) { + return detailView; + } + } + } + const firstId = visible.first.id, + lastId = visible.last.id; + if (lastId - firstId + 1 > numVisible) { + const visibleIds = visible.ids; + for (let i = 1, ii = lastId - firstId; i < ii; i++) { + const holeId = scrolledDown ? firstId + i : lastId - i; + if (visibleIds.has(holeId)) { + continue; + } + const holeView = views[holeId - 1]; + if (!this.isViewFinished(holeView)) { + return holeView; + } + } + } + let preRenderIndex = scrolledDown ? lastId : firstId - 2; + let preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + if (preRenderExtra) { + preRenderIndex += scrolledDown ? 1 : -1; + preRenderView = views[preRenderIndex]; + if (preRenderView && !this.isViewFinished(preRenderView)) { + return preRenderView; + } + } + return null; + } + isViewFinished(view) { + return view.renderingState === RenderingStates.FINISHED; + } + renderView(view) { + switch (view.renderingState) { + case RenderingStates.FINISHED: + return false; + case RenderingStates.PAUSED: + this.highestPriorityPage = view.renderingId; + view.resume(); + break; + case RenderingStates.RUNNING: + this.highestPriorityPage = view.renderingId; + break; + case RenderingStates.INITIAL: + this.highestPriorityPage = view.renderingId; + view.draw().finally(() => { + this.renderHighestPriority(); + }).catch(reason => { + if (reason instanceof RenderingCancelledException) { + return; + } + console.error("renderView:", reason); + }); + break; + } + return true; + } +} + +;// ./web/pdf_scripting_manager.js + + +class PDFScriptingManager { + #closeCapability = null; + #destroyCapability = null; + #docProperties = null; + #eventAbortController = null; + #eventBus = null; + #externalServices = null; + #pdfDocument = null; + #pdfViewer = null; + #ready = false; + #scripting = null; + #willPrintCapability = null; + constructor({ + eventBus, + externalServices = null, + docProperties = null + }) { + this.#eventBus = eventBus; + this.#externalServices = externalServices; + this.#docProperties = docProperties; + } + setViewer(pdfViewer) { + this.#pdfViewer = pdfViewer; + } + async setDocument(pdfDocument) { + if (this.#pdfDocument) { + await this.#destroyScripting(); + } + this.#pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const [objects, calculationOrder, docActions] = await Promise.all([pdfDocument.getFieldObjects(), pdfDocument.getCalculationOrderIds(), pdfDocument.getJSActions()]); + if (!objects && !docActions) { + await this.#destroyScripting(); + return; + } + if (pdfDocument !== this.#pdfDocument) { + return; + } + try { + this.#scripting = this.#initScripting(); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + const eventBus = this.#eventBus; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + eventBus._on("updatefromsandbox", event => { + if (event?.source === window) { + this.#updateFromSandbox(event.detail); + } + }, { + signal + }); + eventBus._on("dispatcheventinsandbox", event => { + this.#scripting?.dispatchEventInSandbox(event.detail); + }, { + signal + }); + eventBus._on("pagechanging", ({ + pageNumber, + previous + }) => { + if (pageNumber === previous) { + return; + } + this.#dispatchPageClose(previous); + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagerendered", ({ + pageNumber + }) => { + if (!this._pageOpenPending.has(pageNumber)) { + return; + } + if (pageNumber !== this.#pdfViewer.currentPageNumber) { + return; + } + this.#dispatchPageOpen(pageNumber); + }, { + signal + }); + eventBus._on("pagesdestroy", async () => { + await this.#dispatchPageClose(this.#pdfViewer.currentPageNumber); + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillClose" + }); + this.#closeCapability?.resolve(); + }, { + signal + }); + try { + const docProperties = await this.#docProperties(pdfDocument); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting.createSandbox({ + objects, + calculationOrder, + appInfo: { + platform: navigator.platform, + language: navigator.language + }, + docInfo: { + ...docProperties, + actions: docActions + } + }); + eventBus.dispatch("sandboxcreated", { + source: this + }); + } catch (error) { + console.error("setDocument:", error); + await this.#destroyScripting(); + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "Open" + }); + await this.#dispatchPageOpen(this.#pdfViewer.currentPageNumber, true); + Promise.resolve().then(() => { + if (pdfDocument === this.#pdfDocument) { + this.#ready = true; + } + }); + } + async dispatchWillSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "WillSave" + }); + } + async dispatchDidSave() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidSave" + }); + } + async dispatchWillPrint() { + if (!this.#scripting) { + return; + } + await this.#willPrintCapability?.promise; + this.#willPrintCapability = Promise.withResolvers(); + try { + await this.#scripting.dispatchEventInSandbox({ + id: "doc", + name: "WillPrint" + }); + } catch (ex) { + this.#willPrintCapability.resolve(); + this.#willPrintCapability = null; + throw ex; + } + await this.#willPrintCapability.promise; + } + async dispatchDidPrint() { + return this.#scripting?.dispatchEventInSandbox({ + id: "doc", + name: "DidPrint" + }); + } + get destroyPromise() { + return this.#destroyCapability?.promise || null; + } + get ready() { + return this.#ready; + } + get _pageOpenPending() { + return shadow(this, "_pageOpenPending", new Set()); + } + get _visitedPages() { + return shadow(this, "_visitedPages", new Map()); + } + async #updateFromSandbox(detail) { + const pdfViewer = this.#pdfViewer; + const isInPresentationMode = pdfViewer.isInPresentationMode || pdfViewer.isChangingPresentationMode; + const { + id, + siblings, + command, + value + } = detail; + if (!id) { + switch (command) { + case "clear": + console.clear(); + break; + case "error": + console.error(value); + break; + case "layout": + if (!isInPresentationMode) { + const modes = apiPageLayoutToViewerModes(value); + pdfViewer.spreadMode = modes.spreadMode; + } + break; + case "page-num": + pdfViewer.currentPageNumber = value + 1; + break; + case "print": + await pdfViewer.pagesPromise; + this.#eventBus.dispatch("print", { + source: this + }); + break; + case "println": + console.log(value); + break; + case "zoom": + if (!isInPresentationMode) { + pdfViewer.currentScaleValue = value; + } + break; + case "SaveAs": + this.#eventBus.dispatch("download", { + source: this + }); + break; + case "FirstPage": + pdfViewer.currentPageNumber = 1; + break; + case "LastPage": + pdfViewer.currentPageNumber = pdfViewer.pagesCount; + break; + case "NextPage": + pdfViewer.nextPage(); + break; + case "PrevPage": + pdfViewer.previousPage(); + break; + case "ZoomViewIn": + if (!isInPresentationMode) { + pdfViewer.increaseScale(); + } + break; + case "ZoomViewOut": + if (!isInPresentationMode) { + pdfViewer.decreaseScale(); + } + break; + case "WillPrintFinished": + this.#willPrintCapability?.resolve(); + this.#willPrintCapability = null; + break; + } + return; + } + if (isInPresentationMode && detail.focus) { + return; + } + delete detail.id; + delete detail.siblings; + const ids = siblings ? [id, ...siblings] : [id]; + for (const elementId of ids) { + const element = document.querySelector(`[data-element-id="${elementId}"]`); + if (element) { + element.dispatchEvent(new CustomEvent("updatefromsandbox", { + detail + })); + } else { + this.#pdfDocument?.annotationStorage.setValue(elementId, detail); + } + } + } + async #dispatchPageOpen(pageNumber, initialize = false) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (initialize) { + this.#closeCapability = Promise.withResolvers(); + } + if (!this.#closeCapability) { + return; + } + const pageView = this.#pdfViewer.getPageView(pageNumber - 1); + if (pageView?.renderingState !== RenderingStates.FINISHED) { + this._pageOpenPending.add(pageNumber); + return; + } + this._pageOpenPending.delete(pageNumber); + const actionsPromise = (async () => { + const actions = await (!visitedPages.has(pageNumber) ? pageView.pdfPage?.getJSActions() : null); + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageOpen", + pageNumber, + actions + }); + })(); + visitedPages.set(pageNumber, actionsPromise); + } + async #dispatchPageClose(pageNumber) { + const pdfDocument = this.#pdfDocument, + visitedPages = this._visitedPages; + if (!this.#closeCapability) { + return; + } + if (this._pageOpenPending.has(pageNumber)) { + return; + } + const actionsPromise = visitedPages.get(pageNumber); + if (!actionsPromise) { + return; + } + visitedPages.set(pageNumber, null); + await actionsPromise; + if (pdfDocument !== this.#pdfDocument) { + return; + } + await this.#scripting?.dispatchEventInSandbox({ + id: "page", + name: "PageClose", + pageNumber + }); + } + #initScripting() { + this.#destroyCapability = Promise.withResolvers(); + if (this.#scripting) { + throw new Error("#initScripting: Scripting already exists."); + } + return this.#externalServices.createScripting(); + } + async #destroyScripting() { + if (!this.#scripting) { + this.#pdfDocument = null; + this.#destroyCapability?.resolve(); + return; + } + if (this.#closeCapability) { + await Promise.race([this.#closeCapability.promise, new Promise(resolve => { + setTimeout(resolve, 1000); + })]).catch(() => {}); + this.#closeCapability = null; + } + this.#pdfDocument = null; + try { + await this.#scripting.destroySandbox(); + } catch {} + this.#willPrintCapability?.reject(new Error("Scripting destroyed.")); + this.#willPrintCapability = null; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._pageOpenPending.clear(); + this._visitedPages.clear(); + this.#scripting = null; + this.#ready = false; + this.#destroyCapability?.resolve(); + } +} + +;// ./web/pdf_sidebar.js + +const SIDEBAR_WIDTH_VAR = "--sidebar-width"; +const SIDEBAR_MIN_WIDTH = 200; +const SIDEBAR_RESIZING_CLASS = "sidebarResizing"; +const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; +class PDFSidebar { + #isRTL = false; + #mouseAC = null; + #outerContainerWidth = null; + #width = null; + constructor({ + elements, + eventBus, + l10n + }) { + this.isOpen = false; + this.active = SidebarView.THUMBS; + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.onToggled = null; + this.onUpdateThumbnails = null; + this.outerContainer = elements.outerContainer; + this.sidebarContainer = elements.sidebarContainer; + this.toggleButton = elements.toggleButton; + this.resizer = elements.resizer; + this.thumbnailButton = elements.thumbnailButton; + this.outlineButton = elements.outlineButton; + this.attachmentsButton = elements.attachmentsButton; + this.layersButton = elements.layersButton; + this.thumbnailView = elements.thumbnailView; + this.outlineView = elements.outlineView; + this.attachmentsView = elements.attachmentsView; + this.layersView = elements.layersView; + this._currentOutlineItemButton = elements.currentOutlineItemButton; + this.eventBus = eventBus; + this.#isRTL = l10n.getDirection() === "rtl"; + this.#addEventListeners(); + } + reset() { + this.isInitialViewSet = false; + this.isInitialEventDispatched = false; + this.#hideUINotification(true); + this.switchView(SidebarView.THUMBS); + this.outlineButton.disabled = false; + this.attachmentsButton.disabled = false; + this.layersButton.disabled = false; + this._currentOutlineItemButton.disabled = true; + } + get visibleView() { + return this.isOpen ? this.active : SidebarView.NONE; + } + setInitialView(view = SidebarView.NONE) { + if (this.isInitialViewSet) { + return; + } + this.isInitialViewSet = true; + if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { + this.#dispatchEvent(); + return; + } + this.switchView(view, true); + if (!this.isInitialEventDispatched) { + this.#dispatchEvent(); + } + } + switchView(view, forceOpen = false) { + const isViewChanged = view !== this.active; + let forceRendering = false; + switch (view) { + case SidebarView.NONE: + if (this.isOpen) { + this.close(); + } + return; + case SidebarView.THUMBS: + if (this.isOpen && isViewChanged) { + forceRendering = true; + } + break; + case SidebarView.OUTLINE: + if (this.outlineButton.disabled) { + return; + } + break; + case SidebarView.ATTACHMENTS: + if (this.attachmentsButton.disabled) { + return; + } + break; + case SidebarView.LAYERS: + if (this.layersButton.disabled) { + return; + } + break; + default: + console.error(`PDFSidebar.switchView: "${view}" is not a valid view.`); + return; + } + this.active = view; + toggleCheckedBtn(this.thumbnailButton, view === SidebarView.THUMBS, this.thumbnailView); + toggleCheckedBtn(this.outlineButton, view === SidebarView.OUTLINE, this.outlineView); + toggleCheckedBtn(this.attachmentsButton, view === SidebarView.ATTACHMENTS, this.attachmentsView); + toggleCheckedBtn(this.layersButton, view === SidebarView.LAYERS, this.layersView); + if (forceOpen && !this.isOpen) { + this.open(); + return; + } + if (forceRendering) { + this.onUpdateThumbnails(); + this.onToggled(); + } + if (isViewChanged) { + this.#dispatchEvent(); + } + } + open() { + if (this.isOpen) { + return; + } + this.isOpen = true; + toggleExpandedBtn(this.toggleButton, true); + this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); + if (this.active === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + this.onToggled(); + this.#dispatchEvent(); + this.#hideUINotification(); + } + close(evt = null) { + if (!this.isOpen) { + return; + } + this.isOpen = false; + toggleExpandedBtn(this.toggleButton, false); + this.outerContainer.classList.add("sidebarMoving"); + this.outerContainer.classList.remove("sidebarOpen"); + this.onToggled(); + this.#dispatchEvent(); + if (evt?.detail > 0) { + this.toggleButton.blur(); + } + } + toggle(evt = null) { + if (this.isOpen) { + this.close(evt); + } else { + this.open(); + } + } + #dispatchEvent() { + if (this.isInitialViewSet) { + this.isInitialEventDispatched ||= true; + } + this.eventBus.dispatch("sidebarviewchanged", { + source: this, + view: this.visibleView + }); + } + #showUINotification() { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-notification-button"); + if (!this.isOpen) { + this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); + } + } + #hideUINotification(reset = false) { + if (this.isOpen || reset) { + this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); + } + if (reset) { + this.toggleButton.setAttribute("data-l10n-id", "pdfjs-toggle-sidebar-button"); + } + } + #addEventListeners() { + const { + eventBus, + outerContainer + } = this; + this.sidebarContainer.addEventListener("transitionend", evt => { + if (evt.target === this.sidebarContainer) { + outerContainer.classList.remove("sidebarMoving"); + eventBus.dispatch("resize", { + source: this + }); + } + }); + this.toggleButton.addEventListener("click", evt => { + this.toggle(evt); + }); + this.thumbnailButton.addEventListener("click", () => { + this.switchView(SidebarView.THUMBS); + }); + this.outlineButton.addEventListener("click", () => { + this.switchView(SidebarView.OUTLINE); + }); + this.outlineButton.addEventListener("dblclick", () => { + eventBus.dispatch("toggleoutlinetree", { + source: this + }); + }); + this.attachmentsButton.addEventListener("click", () => { + this.switchView(SidebarView.ATTACHMENTS); + }); + this.layersButton.addEventListener("click", () => { + this.switchView(SidebarView.LAYERS); + }); + this.layersButton.addEventListener("dblclick", () => { + eventBus.dispatch("resetlayers", { + source: this + }); + }); + this._currentOutlineItemButton.addEventListener("click", () => { + eventBus.dispatch("currentoutlineitem", { + source: this + }); + }); + const onTreeLoaded = (count, button, view) => { + button.disabled = !count; + if (count) { + this.#showUINotification(); + } else if (this.active === view) { + this.switchView(SidebarView.THUMBS); + } + }; + eventBus._on("outlineloaded", evt => { + onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); + evt.currentOutlineItemPromise.then(enabled => { + if (!this.isInitialViewSet) { + return; + } + this._currentOutlineItemButton.disabled = !enabled; + }); + }); + eventBus._on("attachmentsloaded", evt => { + onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); + }); + eventBus._on("layersloaded", evt => { + onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); + }); + eventBus._on("presentationmodechanged", evt => { + if (evt.state === PresentationModeState.NORMAL && this.visibleView === SidebarView.THUMBS) { + this.onUpdateThumbnails(); + } + }); + this.resizer.addEventListener("mousedown", evt => { + if (evt.button !== 0) { + return; + } + outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + this.#mouseAC = new AbortController(); + const opts = { + signal: this.#mouseAC.signal + }; + window.addEventListener("mousemove", this.#mouseMove.bind(this), opts); + window.addEventListener("mouseup", this.#mouseUp.bind(this), opts); + window.addEventListener("blur", this.#mouseUp.bind(this), opts); + }); + eventBus._on("resize", evt => { + if (evt.source !== window) { + return; + } + this.#outerContainerWidth = null; + if (!this.#width) { + return; + } + if (!this.isOpen) { + this.#updateWidth(this.#width); + return; + } + outerContainer.classList.add(SIDEBAR_RESIZING_CLASS); + const updated = this.#updateWidth(this.#width); + Promise.resolve().then(() => { + outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + if (updated) { + eventBus.dispatch("resize", { + source: this + }); + } + }); + }); + } + get outerContainerWidth() { + return this.#outerContainerWidth ||= this.outerContainer.clientWidth; + } + #updateWidth(width = 0) { + const maxWidth = Math.floor(this.outerContainerWidth / 2); + if (width > maxWidth) { + width = maxWidth; + } + if (width < SIDEBAR_MIN_WIDTH) { + width = SIDEBAR_MIN_WIDTH; + } + if (width === this.#width) { + return false; + } + this.#width = width; + docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`); + return true; + } + #mouseMove(evt) { + let width = evt.clientX; + if (this.#isRTL) { + width = this.outerContainerWidth - width; + } + this.#updateWidth(width); + } + #mouseUp(evt) { + this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS); + this.eventBus.dispatch("resize", { + source: this + }); + this.#mouseAC?.abort(); + this.#mouseAC = null; + } +} + +;// ./web/pdf_thumbnail_view.js + + + +const DRAW_UPSCALE_FACTOR = 2; +const MAX_NUM_SCALING_STEPS = 3; +const THUMBNAIL_WIDTH = 98; +function zeroCanvas(c) { + c.width = 0; + c.height = 0; +} +class TempImageFactory { + static #tempCanvas = null; + static getCanvas(width, height) { + const tempCanvas = this.#tempCanvas ||= document.createElement("canvas"); + tempCanvas.width = width; + tempCanvas.height = height; + const ctx = tempCanvas.getContext("2d", { + alpha: false + }); + ctx.save(); + ctx.fillStyle = "rgb(255, 255, 255)"; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + return [tempCanvas, tempCanvas.getContext("2d")]; + } + static destroyCanvas() { + if (this.#tempCanvas) { + zeroCanvas(this.#tempCanvas); + } + this.#tempCanvas = null; + } +} +class PDFThumbnailView { + constructor({ + container, + eventBus, + id, + defaultViewport, + optionalContentConfigPromise, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors + }) { + this.id = id; + this.renderingId = "thumbnail" + id; + this.pageLabel = null; + this.pdfPage = null; + this.rotation = 0; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = optionalContentConfigPromise || null; + this.maxCanvasPixels = maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.pageColors = pageColors || null; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.renderTask = null; + this.renderingState = RenderingStates.INITIAL; + this.resume = null; + const anchor = document.createElement("a"); + anchor.href = linkService.getAnchorUrl("#page=" + id); + anchor.setAttribute("data-l10n-id", "pdfjs-thumb-page-title"); + anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + anchor.onclick = function () { + linkService.goToPage(id); + return false; + }; + this.anchor = anchor; + const div = document.createElement("div"); + div.className = "thumbnail"; + div.setAttribute("data-page-number", this.id); + this.div = div; + this.#updateDims(); + const img = document.createElement("div"); + img.className = "thumbnailImage"; + this._placeholderImg = img; + div.append(img); + anchor.append(div); + container.append(anchor); + } + #updateDims() { + const { + width, + height + } = this.viewport; + const ratio = width / height; + this.canvasWidth = THUMBNAIL_WIDTH; + this.canvasHeight = this.canvasWidth / ratio | 0; + this.scale = this.canvasWidth / width; + const { + style + } = this.div; + style.setProperty("--thumbnail-width", `${this.canvasWidth}px`); + style.setProperty("--thumbnail-height", `${this.canvasHeight}px`); + } + setPdfPage(pdfPage) { + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + reset() { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.div.removeAttribute("data-loaded"); + this.image?.replaceWith(this._placeholderImg); + this.#updateDims(); + if (this.image) { + this.image.removeAttribute("src"); + delete this.image; + } + } + update({ + rotation = null + }) { + if (typeof rotation === "number") { + this.rotation = rotation; + } + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: 1, + rotation: totalRotation + }); + this.reset(); + } + cancelRendering() { + if (this.renderTask) { + this.renderTask.cancel(); + this.renderTask = null; + } + this.resume = null; + } + #getPageDrawContext(upscaleFactor = 1) { + const canvas = document.createElement("canvas"); + const outputScale = new OutputScale(); + const width = upscaleFactor * this.canvasWidth, + height = upscaleFactor * this.canvasHeight; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + canvas.width = width * outputScale.sx | 0; + canvas.height = height * outputScale.sy | 0; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + return { + canvas, + transform + }; + } + #convertCanvasToImage(canvas) { + if (this.renderingState !== RenderingStates.FINISHED) { + throw new Error("#convertCanvasToImage: Rendering has not finished."); + } + const reducedCanvas = this.#reduceImage(canvas); + const image = document.createElement("img"); + image.className = "thumbnailImage"; + image.setAttribute("data-l10n-id", "pdfjs-thumb-page-canvas"); + image.setAttribute("data-l10n-args", this.#pageL10nArgs); + image.src = reducedCanvas.toDataURL(); + this.image = image; + this.div.setAttribute("data-loaded", true); + this._placeholderImg.replaceWith(image); + zeroCanvas(reducedCanvas); + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + return; + } + const { + pageColors, + pdfPage + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const { + canvas, + transform + } = this.#getPageDrawContext(DRAW_UPSCALE_FACTOR); + const drawViewport = this.viewport.clone({ + scale: DRAW_UPSCALE_FACTOR * this.scale + }); + const renderContinueCallback = cont => { + if (!this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + const renderContext = { + canvas, + transform, + viewport: drawViewport, + optionalContentConfigPromise: this._optionalContentConfigPromise, + pageColors + }; + const renderTask = this.renderTask = pdfPage.render(renderContext); + renderTask.onContinue = renderContinueCallback; + let error = null; + try { + await renderTask.promise; + } catch (e) { + if (e instanceof RenderingCancelledException) { + zeroCanvas(canvas); + return; + } + error = e; + } finally { + if (renderTask === this.renderTask) { + this.renderTask = null; + } + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + zeroCanvas(canvas); + this.eventBus.dispatch("thumbnailrendered", { + source: this, + pageNumber: this.id, + pdfPage + }); + if (error) { + throw error; + } + } + setImage(pageView) { + if (this.renderingState !== RenderingStates.INITIAL) { + return; + } + const { + thumbnailCanvas: canvas, + pdfPage, + scale + } = pageView; + if (!canvas) { + return; + } + if (!this.pdfPage) { + this.setPdfPage(pdfPage); + } + if (scale < this.scale) { + return; + } + this.renderingState = RenderingStates.FINISHED; + this.#convertCanvasToImage(canvas); + } + #getReducedImageDims(canvas) { + const width = canvas.width << MAX_NUM_SCALING_STEPS, + height = canvas.height << MAX_NUM_SCALING_STEPS; + const outputScale = new OutputScale(); + outputScale.sx = outputScale.sy = 1; + outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim); + return [width * outputScale.sx | 0, height * outputScale.sy | 0]; + } + #reduceImage(img) { + const { + canvas + } = this.#getPageDrawContext(1); + const ctx = canvas.getContext("2d", { + alpha: false, + willReadFrequently: false + }); + if (img.width <= 2 * canvas.width) { + ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width, canvas.height); + return canvas; + } + let [reducedWidth, reducedHeight] = this.#getReducedImageDims(canvas); + const [reducedImage, reducedImageCtx] = TempImageFactory.getCanvas(reducedWidth, reducedHeight); + while (reducedWidth > img.width || reducedHeight > img.height) { + reducedWidth >>= 1; + reducedHeight >>= 1; + } + reducedImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, reducedWidth, reducedHeight); + while (reducedWidth > 2 * canvas.width) { + reducedImageCtx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, reducedWidth >> 1, reducedHeight >> 1); + reducedWidth >>= 1; + reducedHeight >>= 1; + } + ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight, 0, 0, canvas.width, canvas.height); + return canvas; + } + get #pageL10nArgs() { + return JSON.stringify({ + page: this.pageLabel ?? this.id + }); + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.anchor.setAttribute("data-l10n-args", this.#pageL10nArgs); + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + this.image?.setAttribute("data-l10n-args", this.#pageL10nArgs); + } +} + +;// ./web/pdf_thumbnail_viewer.js + + +const THUMBNAIL_SCROLL_MARGIN = -19; +const THUMBNAIL_SELECTED_CLASS = "selected"; +class PDFThumbnailViewer { + constructor({ + container, + eventBus, + linkService, + renderingQueue, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableHWA + }) { + this.container = container; + this.eventBus = eventBus; + this.linkService = linkService; + this.renderingQueue = renderingQueue; + this.maxCanvasPixels = maxCanvasPixels; + this.maxCanvasDim = maxCanvasDim; + this.pageColors = pageColors || null; + this.enableHWA = enableHWA || false; + this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this), abortSignal); + this.#resetView(); + } + #scrollUpdated() { + this.renderingQueue.renderHighestPriority(); + } + getThumbnail(index) { + return this._thumbnails[index]; + } + #getVisibleThumbs() { + return getVisibleElements({ + scrollEl: this.container, + views: this._thumbnails + }); + } + scrollThumbnailIntoView(pageNumber) { + if (!this.pdfDocument) { + return; + } + const thumbnailView = this._thumbnails[pageNumber - 1]; + if (!thumbnailView) { + console.error('scrollThumbnailIntoView: Invalid "pageNumber" parameter.'); + return; + } + if (pageNumber !== this._currentPageNumber) { + const prevThumbnailView = this._thumbnails[this._currentPageNumber - 1]; + prevThumbnailView.div.classList.remove(THUMBNAIL_SELECTED_CLASS); + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + } + const { + first, + last, + views + } = this.#getVisibleThumbs(); + if (views.length > 0) { + let shouldScroll = false; + if (pageNumber <= first.id || pageNumber >= last.id) { + shouldScroll = true; + } else { + for (const { + id, + percent + } of views) { + if (id !== pageNumber) { + continue; + } + shouldScroll = percent < 100; + break; + } + } + if (shouldScroll) { + scrollIntoView(thumbnailView.div, { + top: THUMBNAIL_SCROLL_MARGIN + }); + } + } + this._currentPageNumber = pageNumber; + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid thumbnails rotation angle."); + } + if (!this.pdfDocument) { + return; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const updateArgs = { + rotation + }; + for (const thumbnail of this._thumbnails) { + thumbnail.update(updateArgs); + } + } + cleanup() { + for (const thumbnail of this._thumbnails) { + if (thumbnail.renderingState !== RenderingStates.FINISHED) { + thumbnail.reset(); + } + } + TempImageFactory.destroyCanvas(); + } + #resetView() { + this._thumbnails = []; + this._currentPageNumber = 1; + this._pageLabels = null; + this._pagesRotation = 0; + this.container.textContent = ""; + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.#cancelRendering(); + this.#resetView(); + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + firstPagePromise.then(firstPdfPage => { + const pagesCount = pdfDocument.numPages; + const viewport = firstPdfPage.getViewport({ + scale: 1 + }); + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const thumbnail = new PDFThumbnailView({ + container: this.container, + eventBus: this.eventBus, + id: pageNum, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + linkService: this.linkService, + renderingQueue: this.renderingQueue, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + pageColors: this.pageColors, + enableHWA: this.enableHWA + }); + this._thumbnails.push(thumbnail); + } + this._thumbnails[0]?.setPdfPage(firstPdfPage); + const thumbnailView = this._thumbnails[this._currentPageNumber - 1]; + thumbnailView.div.classList.add(THUMBNAIL_SELECTED_CLASS); + }).catch(reason => { + console.error("Unable to initialize thumbnail viewer", reason); + }); + } + #cancelRendering() { + for (const thumbnail of this._thumbnails) { + thumbnail.cancelRendering(); + } + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error("PDFThumbnailViewer_setPageLabels: Invalid page labels."); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._thumbnails.length; i < ii; i++) { + this._thumbnails[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + async #ensurePdfPageLoaded(thumbView) { + if (thumbView.pdfPage) { + return thumbView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(thumbView.id); + if (!thumbView.pdfPage) { + thumbView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for thumb view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this._thumbnails.length) { + return false; + } + return this.scroll.down; + } + forceRendering() { + const visibleThumbs = this.#getVisibleThumbs(); + const scrollAhead = this.#getScrollAhead(visibleThumbs); + const thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, scrollAhead, false, true); + if (thumbView) { + this.#ensurePdfPageLoaded(thumbView).then(() => { + this.renderingQueue.renderView(thumbView); + }); + return true; + } + return false; + } +} + +;// ./web/annotation_editor_layer_builder.js + + +class AnnotationEditorLayerBuilder { + #annotationLayer = null; + #drawLayer = null; + #onAppend = null; + #structTreeLayer = null; + #textLayer = null; + #uiManager; + constructor(options) { + this.pdfPage = options.pdfPage; + this.accessibilityManager = options.accessibilityManager; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.annotationEditorLayer = null; + this.div = null; + this._cancelled = false; + this.#uiManager = options.uiManager; + this.#annotationLayer = options.annotationLayer || null; + this.#textLayer = options.textLayer || null; + this.#drawLayer = options.drawLayer || null; + this.#onAppend = options.onAppend || null; + this.#structTreeLayer = options.structTreeLayer || null; + } + async render({ + viewport, + intent = "display" + }) { + if (intent !== "display") { + return; + } + if (this._cancelled) { + return; + } + const clonedViewport = viewport.clone({ + dontFlip: true + }); + if (this.div) { + this.annotationEditorLayer.update({ + viewport: clonedViewport + }); + this.show(); + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationEditorLayer"; + div.hidden = true; + div.dir = this.#uiManager.direction; + this.#onAppend?.(div); + this.annotationEditorLayer = new AnnotationEditorLayer({ + uiManager: this.#uiManager, + div, + structTreeLayer: this.#structTreeLayer, + accessibilityManager: this.accessibilityManager, + pageIndex: this.pdfPage.pageNumber - 1, + l10n: this.l10n, + viewport: clonedViewport, + annotationLayer: this.#annotationLayer, + textLayer: this.#textLayer, + drawLayer: this.#drawLayer + }); + const parameters = { + viewport: clonedViewport, + div, + annotations: null, + intent + }; + this.annotationEditorLayer.render(parameters); + this.show(); + } + cancel() { + this._cancelled = true; + if (!this.div) { + return; + } + this.annotationEditorLayer.destroy(); + } + hide() { + if (!this.div) { + return; + } + this.annotationEditorLayer.pause(true); + this.div.hidden = true; + } + show() { + if (!this.div || this.annotationEditorLayer.isInvisible) { + return; + } + this.div.hidden = false; + this.annotationEditorLayer.pause(false); + } +} + +;// ./web/annotation_layer_builder.js + + +class AnnotationLayerBuilder { + #annotations = null; + #commentManager = null; + #externalHide = false; + #onAppend = null; + #eventAbortController = null; + #linksInjected = false; + constructor({ + pdfPage, + linkService, + downloadManager, + annotationStorage = null, + imageResourcesPath = "", + renderForms = true, + enableComment = false, + commentManager = null, + enableScripting = false, + hasJSActionsPromise = null, + fieldObjectsPromise = null, + annotationCanvasMap = null, + accessibilityManager = null, + annotationEditorUIManager = null, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.linkService = linkService; + this.downloadManager = downloadManager; + this.imageResourcesPath = imageResourcesPath; + this.renderForms = renderForms; + this.annotationStorage = annotationStorage; + this.enableComment = enableComment; + this.#commentManager = commentManager; + this.enableScripting = enableScripting; + this._hasJSActionsPromise = hasJSActionsPromise || Promise.resolve(false); + this._fieldObjectsPromise = fieldObjectsPromise || Promise.resolve(null); + this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; + this._annotationEditorUIManager = annotationEditorUIManager; + this.#onAppend = onAppend; + this.annotationLayer = null; + this.div = null; + this._cancelled = false; + this._eventBus = linkService.eventBus; + } + async render({ + viewport, + intent = "display", + structTreeLayer = null + }) { + if (this.div) { + if (this._cancelled || !this.annotationLayer) { + return; + } + this.annotationLayer.update({ + viewport: viewport.clone({ + dontFlip: true + }) + }); + return; + } + const [annotations, hasJSActions, fieldObjects] = await Promise.all([this.pdfPage.getAnnotations({ + intent + }), this._hasJSActionsPromise, this._fieldObjectsPromise]); + if (this._cancelled) { + return; + } + const div = this.div = document.createElement("div"); + div.className = "annotationLayer"; + this.#onAppend?.(div); + this.#initAnnotationLayer(viewport, structTreeLayer); + if (annotations.length === 0) { + this.#annotations = annotations; + setLayerDimensions(this.div, viewport); + return; + } + await this.annotationLayer.render({ + annotations, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.renderForms, + downloadManager: this.downloadManager, + enableComment: this.enableComment, + enableScripting: this.enableScripting, + hasJSActions, + fieldObjects + }); + this.#annotations = annotations; + if (this.linkService.isInPresentationMode) { + this.#updatePresentationModeState(PresentationModeState.FULLSCREEN); + } + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this._eventBus?._on("presentationmodechanged", evt => { + this.#updatePresentationModeState(evt.state); + }, { + signal: this.#eventAbortController.signal + }); + } + } + #initAnnotationLayer(viewport, structTreeLayer) { + this.annotationLayer = new AnnotationLayer({ + div: this.div, + accessibilityManager: this._accessibilityManager, + annotationCanvasMap: this._annotationCanvasMap, + annotationEditorUIManager: this._annotationEditorUIManager, + annotationStorage: this.annotationStorage, + page: this.pdfPage, + viewport: viewport.clone({ + dontFlip: true + }), + structTreeLayer, + commentManager: this.#commentManager, + linkService: this.linkService + }); + } + cancel() { + this._cancelled = true; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + } + hide(internal = false) { + this.#externalHide = !internal; + if (!this.div) { + return; + } + this.div.hidden = true; + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + async injectLinkAnnotations(inferredLinks) { + if (this.#annotations === null) { + throw new Error("`render` method must be called before `injectLinkAnnotations`."); + } + if (this._cancelled || this.#linksInjected) { + return; + } + this.#linksInjected = true; + const newLinks = this.#annotations.length ? this.#checkInferredLinks(inferredLinks) : inferredLinks; + if (!newLinks.length) { + return; + } + await this.annotationLayer.addLinkAnnotations(newLinks); + if (!this.#externalHide) { + this.div.hidden = false; + } + } + #updatePresentationModeState(state) { + if (!this.div) { + return; + } + let disableFormElements = false; + switch (state) { + case PresentationModeState.FULLSCREEN: + disableFormElements = true; + break; + case PresentationModeState.NORMAL: + break; + default: + return; + } + for (const section of this.div.childNodes) { + if (section.hasAttribute("data-internal-link")) { + continue; + } + section.inert = disableFormElements; + } + } + #checkInferredLinks(inferredLinks) { + function annotationRects(annot) { + if (!annot.quadPoints) { + return [annot.rect]; + } + const rects = []; + for (let i = 2, ii = annot.quadPoints.length; i < ii; i += 8) { + const trX = annot.quadPoints[i]; + const trY = annot.quadPoints[i + 1]; + const blX = annot.quadPoints[i + 2]; + const blY = annot.quadPoints[i + 3]; + rects.push([blX, blY, trX, trY]); + } + return rects; + } + function intersectAnnotations(annot1, annot2) { + const intersections = []; + const annot1Rects = annotationRects(annot1); + const annot2Rects = annotationRects(annot2); + for (const rect1 of annot1Rects) { + for (const rect2 of annot2Rects) { + const intersection = Util.intersect(rect1, rect2); + if (intersection) { + intersections.push(intersection); + } + } + } + return intersections; + } + function areaRects(rects) { + let totalArea = 0; + for (const rect of rects) { + totalArea += Math.abs((rect[2] - rect[0]) * (rect[3] - rect[1])); + } + return totalArea; + } + return inferredLinks.filter(link => { + let linkAreaRects; + for (const annotation of this.#annotations) { + if (annotation.annotationType !== AnnotationType.LINK || !annotation.url) { + continue; + } + const intersections = intersectAnnotations(annotation, link); + if (intersections.length === 0) { + continue; + } + linkAreaRects ??= areaRects(annotationRects(link)); + if (areaRects(intersections) / linkAreaRects > 0.5) { + return false; + } + } + return true; + }); + } +} + +;// ./web/autolinker.js + + +function DOMRectToPDF({ + width, + height, + left, + top +}, pdfPageView) { + if (width === 0 || height === 0) { + return null; + } + const pageBox = pdfPageView.textLayer.div.getBoundingClientRect(); + const bottomLeft = pdfPageView.getPagePoint(left - pageBox.left, top - pageBox.top); + const topRight = pdfPageView.getPagePoint(left - pageBox.left + width, top - pageBox.top + height); + return Util.normalizeRect([bottomLeft[0], bottomLeft[1], topRight[0], topRight[1]]); +} +function calculateLinkPosition(range, pdfPageView) { + const rangeRects = range.getClientRects(); + if (rangeRects.length === 1) { + return { + rect: DOMRectToPDF(rangeRects[0], pdfPageView) + }; + } + const rect = [Infinity, Infinity, -Infinity, -Infinity]; + const quadPoints = []; + let i = 0; + for (const domRect of rangeRects) { + const normalized = DOMRectToPDF(domRect, pdfPageView); + if (normalized === null) { + continue; + } + quadPoints[i] = quadPoints[i + 4] = normalized[0]; + quadPoints[i + 1] = quadPoints[i + 3] = normalized[3]; + quadPoints[i + 2] = quadPoints[i + 6] = normalized[2]; + quadPoints[i + 5] = quadPoints[i + 7] = normalized[1]; + Util.rectBoundingBox(...normalized, rect); + i += 8; + } + return { + quadPoints, + rect + }; +} +function textPosition(container, offset) { + let currentContainer = container; + do { + if (currentContainer.nodeType === Node.TEXT_NODE) { + const currentLength = currentContainer.textContent.length; + if (offset <= currentLength) { + return [currentContainer, offset]; + } + offset -= currentLength; + } else if (currentContainer.firstChild) { + currentContainer = currentContainer.firstChild; + continue; + } + while (!currentContainer.nextSibling && currentContainer !== container) { + currentContainer = currentContainer.parentNode; + } + if (currentContainer !== container) { + currentContainer = currentContainer.nextSibling; + } + } while (currentContainer !== container); + throw new Error("Offset is bigger than container's contents length."); +} +function createLinkAnnotation({ + url, + index, + length +}, pdfPageView, id) { + const highlighter = pdfPageView._textHighlighter; + const [{ + begin, + end + }] = highlighter._convertMatches([index], [length]); + const range = new Range(); + range.setStart(...textPosition(highlighter.textDivs[begin.divIdx], begin.offset)); + range.setEnd(...textPosition(highlighter.textDivs[end.divIdx], end.offset)); + return { + id: `inferred_link_${id}`, + unsafeUrl: url, + url, + annotationType: AnnotationType.LINK, + rotation: 0, + ...calculateLinkPosition(range, pdfPageView), + borderStyle: null + }; +} +class Autolinker { + static #index = 0; + static #regex; + static findLinks(text) { + this.#regex ??= /\b(?:https?:\/\/|mailto:|www\.)(?:[\S--[\p{P}<>]]|\/|[\S--[\[\]]]+[\S--[\p{P}<>]])+|\b[\S--[@\p{Ps}\p{Pe}<>]]+@([\S--[\p{P}<>]]+(?:\.[\S--[\p{P}<>]]+)+)/gmv; + const [normalizedText, diffs] = normalize(text, { + ignoreDashEOL: true + }); + const matches = normalizedText.matchAll(this.#regex); + const links = []; + for (const match of matches) { + const [url, emailDomain] = match; + let raw; + if (url.startsWith("www.") || url.startsWith("http://") || url.startsWith("https://")) { + raw = url; + } else if (URL.canParse(`http://${emailDomain}`)) { + raw = url.startsWith("mailto:") ? url : `mailto:${url}`; + } else { + continue; + } + const absoluteURL = createValidAbsoluteUrl(raw, null, { + addDefaultProtocol: true + }); + if (absoluteURL) { + const [index, length] = getOriginalIndex(diffs, match.index, url.length); + links.push({ + url: absoluteURL.href, + index, + length + }); + } + } + return links; + } + static processLinks(pdfPageView) { + return this.findLinks(pdfPageView._textHighlighter.textContentItemsStr.join("\n")).map(link => createLinkAnnotation(link, pdfPageView, this.#index++)); + } +} + +;// ./web/base_pdf_page_view.js + + +class BasePDFPageView { + #loadingId = null; + #minDurationToUpdateCanvas = 0; + #renderError = null; + #renderingState = RenderingStates.INITIAL; + #showCanvas = null; + #startTime = 0; + #tempCanvas = null; + canvas = null; + div = null; + enableOptimizedPartialRendering = false; + eventBus = null; + id = null; + pageColors = null; + recordedBBoxes = null; + renderingQueue = null; + renderTask = null; + resume = null; + constructor(options) { + this.eventBus = options.eventBus; + this.id = options.id; + this.pageColors = options.pageColors || null; + this.renderingQueue = options.renderingQueue; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; + } + get renderingState() { + return this.#renderingState; + } + set renderingState(state) { + if (state === this.#renderingState) { + return; + } + this.#renderingState = state; + if (this.#loadingId) { + clearTimeout(this.#loadingId); + this.#loadingId = null; + } + switch (state) { + case RenderingStates.PAUSED: + this.div.classList.remove("loading"); + this.#startTime = 0; + this.#showCanvas?.(false); + break; + case RenderingStates.RUNNING: + this.div.classList.add("loadingIcon"); + this.#loadingId = setTimeout(() => { + this.div.classList.add("loading"); + this.#loadingId = null; + }, 0); + this.#startTime = Date.now(); + break; + case RenderingStates.INITIAL: + case RenderingStates.FINISHED: + this.div.classList.remove("loadingIcon", "loading"); + this.#startTime = 0; + break; + } + } + _createCanvas(onShow, hideUntilComplete = false) { + const { + pageColors + } = this; + const hasHCM = !!(pageColors?.background && pageColors?.foreground); + const prevCanvas = this.canvas; + const updateOnFirstShow = !prevCanvas && !hasHCM && !hideUntilComplete; + let canvas = this.canvas = document.createElement("canvas"); + this.#showCanvas = isLastShow => { + if (updateOnFirstShow) { + let tempCanvas = this.#tempCanvas; + if (!isLastShow && this.#minDurationToUpdateCanvas > 0) { + if (Date.now() - this.#startTime < this.#minDurationToUpdateCanvas) { + return; + } + if (!tempCanvas) { + tempCanvas = this.#tempCanvas = canvas; + canvas = this.canvas = canvas.cloneNode(false); + onShow(canvas); + } + } + if (tempCanvas) { + const ctx = canvas.getContext("2d", { + alpha: false + }); + ctx.drawImage(tempCanvas, 0, 0); + if (isLastShow) { + this.#resetTempCanvas(); + } else { + this.#startTime = Date.now(); + } + return; + } + onShow(canvas); + this.#showCanvas = null; + return; + } + if (!isLastShow) { + return; + } + if (prevCanvas) { + prevCanvas.replaceWith(canvas); + prevCanvas.width = prevCanvas.height = 0; + } else { + onShow(canvas); + } + }; + return { + canvas, + prevCanvas + }; + } + #renderContinueCallback = cont => { + this.#showCanvas?.(false); + if (this.renderingQueue && !this.renderingQueue.isHighestPriority(this)) { + this.renderingState = RenderingStates.PAUSED; + this.resume = () => { + this.renderingState = RenderingStates.RUNNING; + cont(); + }; + return; + } + cont(); + }; + _resetCanvas() { + const { + canvas + } = this; + if (!canvas) { + return; + } + canvas.remove(); + canvas.width = canvas.height = 0; + this.canvas = null; + this.#resetTempCanvas(); + } + #resetTempCanvas() { + if (this.#tempCanvas) { + this.#tempCanvas.width = this.#tempCanvas.height = 0; + this.#tempCanvas = null; + } + } + async _drawCanvas(options, onCancel, onFinish) { + const renderTask = this.renderTask = this.pdfPage.render(options); + renderTask.onContinue = this.#renderContinueCallback; + renderTask.onError = error => { + if (error instanceof RenderingCancelledException) { + onCancel(); + this.#renderError = null; + } + }; + let error = null; + try { + await renderTask.promise; + this.#showCanvas?.(true); + } catch (e) { + if (e instanceof RenderingCancelledException) { + return; + } + error = e; + this.#showCanvas?.(true); + } finally { + this.#renderError = error; + if (renderTask === this.renderTask) { + this.renderTask = null; + if (this.enableOptimizedPartialRendering) { + this.recordedBBoxes ??= renderTask.recordedBBoxes; + } + } + } + this.renderingState = RenderingStates.FINISHED; + onFinish(renderTask); + if (error) { + throw error; + } + } + cancelRendering({ + cancelExtraDelay = 0 + } = {}) { + if (this.renderTask) { + this.renderTask.cancel(cancelExtraDelay); + this.renderTask = null; + } + this.resume = null; + } + dispatchPageRender() { + this.eventBus.dispatch("pagerender", { + source: this, + pageNumber: this.id + }); + } + dispatchPageRendered(cssTransform, isDetailView) { + this.eventBus.dispatch("pagerendered", { + source: this, + pageNumber: this.id, + cssTransform, + isDetailView, + timestamp: performance.now(), + error: this.#renderError + }); + } +} + +;// ./web/draw_layer_builder.js + +class DrawLayerBuilder { + #drawLayer = null; + constructor(options) { + this.pageIndex = options.pageIndex; + } + async render({ + intent = "display" + }) { + if (intent !== "display" || this.#drawLayer || this._cancelled) { + return; + } + this.#drawLayer = new DrawLayer({ + pageIndex: this.pageIndex + }); + } + cancel() { + this._cancelled = true; + if (!this.#drawLayer) { + return; + } + this.#drawLayer.destroy(); + this.#drawLayer = null; + } + setParent(parent) { + this.#drawLayer?.setParent(parent); + } + getDrawLayer() { + return this.#drawLayer; + } +} + +;// ./web/pdf_page_detail_view.js + + + +class PDFPageDetailView extends BasePDFPageView { + #detailArea = null; + renderingCancelled = false; + constructor({ + pageView + }) { + super(pageView); + this.pageView = pageView; + this.renderingId = "detail" + this.id; + this.div = pageView.div; + } + setPdfPage(pdfPage) { + this.pageView.setPdfPage(pdfPage); + } + get pdfPage() { + return this.pageView.pdfPage; + } + get renderingState() { + return super.renderingState; + } + set renderingState(value) { + this.renderingCancelled = false; + super.renderingState = value; + } + reset({ + keepCanvas = false + } = {}) { + const renderingCancelled = this.renderingCancelled || this.renderingState === RenderingStates.RUNNING || this.renderingState === RenderingStates.PAUSED; + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + this.renderingCancelled = renderingCancelled; + if (!keepCanvas) { + this._resetCanvas(); + } + } + #shouldRenderDifferentArea(visibleArea) { + if (!this.#detailArea) { + return true; + } + const minDetailX = this.#detailArea.minX; + const minDetailY = this.#detailArea.minY; + const maxDetailX = this.#detailArea.width + minDetailX; + const maxDetailY = this.#detailArea.height + minDetailY; + if (visibleArea.minX < minDetailX || visibleArea.minY < minDetailY || visibleArea.maxX > maxDetailX || visibleArea.maxY > maxDetailY) { + return true; + } + const { + width: maxWidth, + height: maxHeight, + scale + } = this.pageView.viewport; + if (this.#detailArea.scale !== scale) { + return true; + } + const paddingLeftSize = visibleArea.minX - minDetailX; + const paddingRightSize = maxDetailX - visibleArea.maxX; + const paddingTopSize = visibleArea.minY - minDetailY; + const paddingBottomSize = maxDetailY - visibleArea.maxY; + const MOVEMENT_THRESHOLD = 0.5; + const ratio = (1 + MOVEMENT_THRESHOLD) / MOVEMENT_THRESHOLD; + if (minDetailX > 0 && paddingRightSize / paddingLeftSize > ratio || maxDetailX < maxWidth && paddingLeftSize / paddingRightSize > ratio || minDetailY > 0 && paddingBottomSize / paddingTopSize > ratio || maxDetailY < maxHeight && paddingTopSize / paddingBottomSize > ratio) { + return true; + } + return false; + } + update({ + visibleArea = null, + underlyingViewUpdated = false + } = {}) { + if (underlyingViewUpdated) { + this.cancelRendering(); + this.renderingState = RenderingStates.INITIAL; + return; + } + if (!this.#shouldRenderDifferentArea(visibleArea)) { + return; + } + const { + viewport, + maxCanvasPixels, + capCanvasAreaFactor + } = this.pageView; + const visibleWidth = visibleArea.maxX - visibleArea.minX; + const visibleHeight = visibleArea.maxY - visibleArea.minY; + const visiblePixels = visibleWidth * visibleHeight * OutputScale.pixelRatio ** 2; + const maxDetailToVisibleLinearRatio = Math.sqrt(OutputScale.capPixels(maxCanvasPixels, capCanvasAreaFactor) / visiblePixels); + const maxOverflowScale = (maxDetailToVisibleLinearRatio - 1) / 2; + let overflowScale = Math.min(1, maxOverflowScale); + if (overflowScale < 0) { + overflowScale = 0; + } + const overflowWidth = visibleWidth * overflowScale; + const overflowHeight = visibleHeight * overflowScale; + const minX = Math.max(0, visibleArea.minX - overflowWidth); + const maxX = Math.min(viewport.width, visibleArea.maxX + overflowWidth); + const minY = Math.max(0, visibleArea.minY - overflowHeight); + const maxY = Math.min(viewport.height, visibleArea.maxY + overflowHeight); + const width = maxX - minX; + const height = maxY - minY; + this.#detailArea = { + minX, + minY, + width, + height, + scale: viewport.scale + }; + this.reset({ + keepCanvas: true + }); + } + _getRenderingContext(canvas, transform) { + const baseContext = this.pageView._getRenderingContext(canvas, transform, false); + const recordedBBoxes = this.pdfPage.recordedBBoxes; + if (!recordedBBoxes || !this.enableOptimizedPartialRendering) { + return baseContext; + } + const { + viewport: { + width: vWidth, + height: vHeight + } + } = this.pageView; + const { + width: aWidth, + height: aHeight, + minX: aMinX, + minY: aMinY + } = this.#detailArea; + const detailMinX = aMinX / vWidth; + const detailMinY = aMinY / vHeight; + const detailMaxX = (aMinX + aWidth) / vWidth; + const detailMaxY = (aMinY + aHeight) / vHeight; + return { + ...baseContext, + operationsFilter(index) { + if (recordedBBoxes.isEmpty(index)) { + return false; + } + return recordedBBoxes.minX(index) <= detailMaxX && recordedBBoxes.maxX(index) >= detailMinX && recordedBBoxes.minY(index) <= detailMaxY && recordedBBoxes.maxY(index) >= detailMinY; + } + }; + } + async draw() { + if (this.pageView.detailView !== this) { + return undefined; + } + const hideUntilComplete = this.pageView.renderingState === RenderingStates.FINISHED || this.renderingState === RenderingStates.FINISHED; + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + pdfPage, + viewport + } = this.pageView; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this.pageView._ensureCanvasWrapper(); + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + if (canvasWrapper.firstElementChild?.tagName === "CANVAS") { + canvasWrapper.firstElementChild.after(newCanvas); + } else { + canvasWrapper.prepend(newCanvas); + } + }, hideUntilComplete); + canvas.ariaHidden = true; + if (this.enableOptimizedPartialRendering) { + canvas.className = "detailView"; + } + const { + width, + height + } = viewport; + const area = this.#detailArea; + const { + pixelRatio + } = OutputScale; + const transform = [pixelRatio, 0, 0, pixelRatio, -area.minX * pixelRatio, -area.minY * pixelRatio]; + canvas.width = area.width * pixelRatio; + canvas.height = area.height * pixelRatio; + const { + style + } = canvas; + style.width = `${area.width * 100 / width}%`; + style.height = `${area.height * 100 / height}%`; + style.top = `${area.minY * 100 / height}%`; + style.left = `${area.minX * 100 / width}%`; + const renderingPromise = this._drawCanvas(this._getRenderingContext(canvas, transform), () => { + this.canvas?.remove(); + this.canvas = prevCanvas; + }, () => { + this.dispatchPageRendered(false, true); + }); + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return renderingPromise; + } +} + +;// ./web/struct_tree_layer_builder.js + +const PDF_ROLE_TO_HTML_ROLE = { + Document: null, + DocumentFragment: null, + Part: "group", + Sect: "group", + Div: "group", + Aside: "note", + NonStruct: "none", + P: null, + H: "heading", + Title: null, + FENote: "note", + Sub: "group", + Lbl: null, + Span: null, + Em: null, + Strong: null, + Link: "link", + Annot: "note", + Form: "form", + Ruby: null, + RB: null, + RT: null, + RP: null, + Warichu: null, + WT: null, + WP: null, + L: "list", + LI: "listitem", + LBody: null, + Table: "table", + TR: "row", + TH: "columnheader", + TD: "cell", + THead: "columnheader", + TBody: null, + TFoot: null, + Caption: null, + Figure: "figure", + Formula: null, + Artifact: null +}; +const HEADING_PATTERN = /^H(\d+)$/; +class StructTreeLayerBuilder { + #promise; + #treeDom = null; + #treePromise; + #elementAttributes = new Map(); + #rawDims; + #elementsToAddToTextLayer = null; + constructor(pdfPage, rawDims) { + this.#promise = pdfPage.getStructTree(); + this.#rawDims = rawDims; + } + async render() { + if (this.#treePromise) { + return this.#treePromise; + } + const { + promise, + resolve, + reject + } = Promise.withResolvers(); + this.#treePromise = promise; + try { + this.#treeDom = this.#walk(await this.#promise); + } catch (ex) { + reject(ex); + } + this.#promise = null; + this.#treeDom?.classList.add("structTree"); + resolve(this.#treeDom); + return promise; + } + async getAriaAttributes(annotationId) { + try { + await this.render(); + return this.#elementAttributes.get(annotationId); + } catch {} + return null; + } + hide() { + if (this.#treeDom && !this.#treeDom.hidden) { + this.#treeDom.hidden = true; + } + } + show() { + if (this.#treeDom?.hidden) { + this.#treeDom.hidden = false; + } + } + #setAttributes(structElement, htmlElement) { + const { + alt, + id, + lang + } = structElement; + if (alt !== undefined) { + let added = false; + const label = removeNullCharacters(alt); + for (const child of structElement.children) { + if (child.type === "annotation") { + let attrs = this.#elementAttributes.get(child.id); + if (!attrs) { + attrs = new Map(); + this.#elementAttributes.set(child.id, attrs); + } + attrs.set("aria-label", label); + added = true; + } + } + if (!added) { + htmlElement.setAttribute("aria-label", label); + } + } + if (id !== undefined) { + htmlElement.setAttribute("aria-owns", id); + } + if (lang !== undefined) { + htmlElement.setAttribute("lang", removeNullCharacters(lang, true)); + } + } + #addImageInTextLayer(node, element) { + const { + alt, + bbox, + children + } = node; + const child = children?.[0]; + if (!this.#rawDims || !alt || !bbox || child?.type !== "content") { + return false; + } + const { + id + } = child; + if (!id) { + return false; + } + element.setAttribute("aria-owns", id); + const img = document.createElement("span"); + (this.#elementsToAddToTextLayer ||= new Map()).set(id, img); + img.setAttribute("role", "img"); + img.setAttribute("aria-label", removeNullCharacters(alt)); + const { + pageHeight, + pageX, + pageY + } = this.#rawDims; + const calc = "calc(var(--total-scale-factor) *"; + const { + style + } = img; + style.width = `${calc}${bbox[2] - bbox[0]}px)`; + style.height = `${calc}${bbox[3] - bbox[1]}px)`; + style.left = `${calc}${bbox[0] - pageX}px)`; + style.top = `${calc}${pageHeight - bbox[3] + pageY}px)`; + return true; + } + addElementsToTextLayer() { + if (!this.#elementsToAddToTextLayer) { + return; + } + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; + } + #walk(node) { + if (!node) { + return null; + } + const element = document.createElement("span"); + if ("role" in node) { + const { + role + } = node; + const match = role.match(HEADING_PATTERN); + if (match) { + element.setAttribute("role", "heading"); + element.setAttribute("aria-level", match[1]); + } else if (PDF_ROLE_TO_HTML_ROLE[role]) { + element.setAttribute("role", PDF_ROLE_TO_HTML_ROLE[role]); + } + if (role === "Figure" && this.#addImageInTextLayer(node, element)) { + return element; + } + } + this.#setAttributes(node, element); + if (node.children) { + if (node.children.length === 1 && "id" in node.children[0]) { + this.#setAttributes(node.children[0], element); + } else { + for (const kid of node.children) { + element.append(this.#walk(kid)); + } + } + } + return element; + } +} + +;// ./web/text_accessibility.js + +class TextAccessibilityManager { + #enabled = false; + #textChildren = null; + #textNodes = new Map(); + #waitingElements = new Map(); + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + return centerX1 - centerX2; + } + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + if (this.#textNodes.size > 0) { + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + const element = document.getElementById(id); + if (!element) { + this.#textNodes.delete(id); + continue; + } + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + disable() { + if (!this.#enabled) { + return; + } + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + const { + id + } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + const node = children[nodeIndex]; + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns.split(" ").filter(x => x !== id).join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + addPointerInTextLayer(element, isRemovable) { + const { + id + } = element; + if (!id) { + return null; + } + if (!this.#enabled) { + this.#waitingElements.set(element, isRemovable); + return null; + } + if (isRemovable) { + this.removePointerInTextLayer(element); + } + const children = this.#textChildren; + if (!children || children.length === 0) { + return null; + } + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(element, node) < 0); + const nodeIndex = Math.max(0, index - 1); + const child = children[nodeIndex]; + this.#addIdToAriaOwns(id, child); + this.#textNodes.set(id, nodeIndex); + const parent = child.parentNode; + return parent?.classList.contains("markedContent") ? parent.id : null; + } + moveElementInDOM(container, element, contentElement, isRemovable) { + const id = this.addPointerInTextLayer(contentElement, isRemovable); + if (!container.hasChildNodes()) { + container.append(element); + return id; + } + const children = Array.from(container.childNodes).filter(node => node !== element); + if (children.length === 0) { + return id; + } + const elementToCompare = contentElement || element; + const index = binarySearchFirstItem(children, node => TextAccessibilityManager.#compareElementPositions(elementToCompare, node) < 0); + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + return id; + } +} + +;// ./web/text_highlighter.js +class TextHighlighter { + #eventAbortController = null; + constructor({ + findController, + eventBus, + pageIndex + }) { + this.findController = findController; + this.matches = []; + this.eventBus = eventBus; + this.pageIdx = pageIndex; + this.textDivs = null; + this.textContentItemsStr = null; + this.enabled = false; + } + setTextMapping(divs, texts) { + this.textDivs = divs; + this.textContentItemsStr = texts; + } + enable() { + if (!this.textDivs || !this.textContentItemsStr) { + throw new Error("Text divs and strings have not been set."); + } + if (this.enabled) { + throw new Error("TextHighlighter is already enabled."); + } + this.enabled = true; + if (!this.#eventAbortController) { + this.#eventAbortController = new AbortController(); + this.eventBus._on("updatetextlayermatches", evt => { + if (evt.pageIndex === this.pageIdx || evt.pageIndex === -1) { + this._updateMatches(); + } + }, { + signal: this.#eventAbortController.signal + }); + } + this._updateMatches(); + } + disable() { + if (!this.enabled) { + return; + } + this.enabled = false; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this._updateMatches(true); + } + _convertMatches(matches, matchesLength) { + if (!matches) { + return []; + } + const { + textContentItemsStr + } = this; + let i = 0, + iIndex = 0; + const end = textContentItemsStr.length - 1; + const result = []; + for (let m = 0, mm = matches.length; m < mm; m++) { + let matchIdx = matches[m]; + while (i !== end && matchIdx >= iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + if (i === textContentItemsStr.length) { + console.error("Could not find a matching mapping"); + } + const match = { + begin: { + divIdx: i, + offset: matchIdx - iIndex + } + }; + matchIdx += matchesLength[m]; + while (i !== end && matchIdx > iIndex + textContentItemsStr[i].length) { + iIndex += textContentItemsStr[i].length; + i++; + } + match.end = { + divIdx: i, + offset: matchIdx - iIndex + }; + result.push(match); + } + return result; + } + _renderMatches(matches) { + if (matches.length === 0) { + return; + } + const { + findController, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + const isSelectedPage = pageIdx === findController.selected.pageIdx; + const selectedMatchIdx = findController.selected.matchIdx; + const highlightAll = findController.state.highlightAll; + let prevEnd = null; + const infinity = { + divIdx: -1, + offset: undefined + }; + function beginText(begin, className) { + const divIdx = begin.divIdx; + textDivs[divIdx].textContent = ""; + return appendTextToDiv(divIdx, 0, begin.offset, className); + } + function appendTextToDiv(divIdx, fromOffset, toOffset, className) { + let div = textDivs[divIdx]; + if (div.nodeType === Node.TEXT_NODE) { + const span = document.createElement("span"); + div.before(span); + span.append(div); + textDivs[divIdx] = span; + div = span; + } + const content = textContentItemsStr[divIdx].substring(fromOffset, toOffset); + const node = document.createTextNode(content); + if (className) { + const span = document.createElement("span"); + span.className = `${className} appended`; + span.append(node); + div.append(span); + if (className.includes("selected")) { + const { + left + } = span.getClientRects()[0]; + const parentLeft = div.getBoundingClientRect().left; + return left - parentLeft; + } + return 0; + } + div.append(node); + return 0; + } + let i0 = selectedMatchIdx, + i1 = i0 + 1; + if (highlightAll) { + i0 = 0; + i1 = matches.length; + } else if (!isSelectedPage) { + return; + } + let lastDivIdx = -1; + let lastOffset = -1; + for (let i = i0; i < i1; i++) { + const match = matches[i]; + const begin = match.begin; + if (begin.divIdx === lastDivIdx && begin.offset === lastOffset) { + continue; + } + lastDivIdx = begin.divIdx; + lastOffset = begin.offset; + const end = match.end; + const isSelected = isSelectedPage && i === selectedMatchIdx; + const highlightSuffix = isSelected ? " selected" : ""; + let selectedLeft = 0; + if (!prevEnd || begin.divIdx !== prevEnd.divIdx) { + if (prevEnd !== null) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + beginText(begin); + } else { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset); + } + if (begin.divIdx === end.divIdx) { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, end.offset, "highlight" + highlightSuffix); + } else { + selectedLeft = appendTextToDiv(begin.divIdx, begin.offset, infinity.offset, "highlight begin" + highlightSuffix); + for (let n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) { + textDivs[n0].className = "highlight middle" + highlightSuffix; + } + beginText(end, "highlight end" + highlightSuffix); + } + prevEnd = end; + if (isSelected) { + findController.scrollMatchIntoView({ + element: textDivs[begin.divIdx], + selectedLeft, + pageIndex: pageIdx, + matchIndex: selectedMatchIdx + }); + } + } + if (prevEnd) { + appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset); + } + } + _updateMatches(reset = false) { + if (!this.enabled && !reset) { + return; + } + const { + findController, + matches, + pageIdx + } = this; + const { + textContentItemsStr, + textDivs + } = this; + let clearedUntilDivIdx = -1; + for (const match of matches) { + const begin = Math.max(clearedUntilDivIdx, match.begin.divIdx); + for (let n = begin, end = match.end.divIdx; n <= end; n++) { + const div = textDivs[n]; + div.textContent = textContentItemsStr[n]; + div.className = ""; + } + clearedUntilDivIdx = match.end.divIdx + 1; + } + if (!findController?.highlightMatches || reset) { + return; + } + const pageMatches = findController.pageMatches[pageIdx] || null; + const pageMatchesLength = findController.pageMatchesLength[pageIdx] || null; + this.matches = this._convertMatches(pageMatches, pageMatchesLength); + this._renderMatches(this.matches); + } +} + +;// ./web/text_layer_builder.js + + +class TextLayerBuilder { + #enablePermissions = false; + #onAppend = null; + #renderingDone = false; + #textLayer = null; + static #textLayers = new Map(); + static #selectionChangeAbortController = null; + constructor({ + pdfPage, + highlighter = null, + accessibilityManager = null, + enablePermissions = false, + onAppend = null + }) { + this.pdfPage = pdfPage; + this.highlighter = highlighter; + this.accessibilityManager = accessibilityManager; + this.#enablePermissions = enablePermissions === true; + this.#onAppend = onAppend; + this.div = document.createElement("div"); + this.div.tabIndex = 0; + this.div.className = "textLayer"; + } + async render({ + viewport, + textContentParams = null + }) { + if (this.#renderingDone && this.#textLayer) { + this.#textLayer.update({ + viewport, + onBefore: this.hide.bind(this) + }); + this.show(); + return; + } + this.cancel(); + this.#textLayer = new TextLayer({ + textContentSource: this.pdfPage.streamTextContent(textContentParams || { + includeMarkedContent: true, + disableNormalization: true + }), + container: this.div, + viewport + }); + const { + textDivs, + textContentItemsStr + } = this.#textLayer; + this.highlighter?.setTextMapping(textDivs, textContentItemsStr); + this.accessibilityManager?.setTextMapping(textDivs); + await this.#textLayer.render(); + this.#renderingDone = true; + const endOfContent = document.createElement("div"); + endOfContent.className = "endOfContent"; + this.div.append(endOfContent); + this.#bindMouse(endOfContent); + this.#onAppend?.(this.div); + this.highlighter?.enable(); + this.accessibilityManager?.enable(); + } + hide() { + if (!this.div.hidden && this.#renderingDone) { + this.highlighter?.disable(); + this.div.hidden = true; + } + } + show() { + if (this.div.hidden && this.#renderingDone) { + this.div.hidden = false; + this.highlighter?.enable(); + } + } + cancel() { + this.#textLayer?.cancel(); + this.#textLayer = null; + this.highlighter?.disable(); + this.accessibilityManager?.disable(); + TextLayerBuilder.#removeGlobalSelectionListener(this.div); + } + #bindMouse(end) { + const { + div + } = this; + div.addEventListener("mousedown", () => { + div.classList.add("selecting"); + }); + div.addEventListener("copy", event => { + if (!this.#enablePermissions) { + const selection = document.getSelection(); + event.clipboardData.setData("text/plain", removeNullCharacters(normalizeUnicode(selection.toString()))); + } + stopEvent(event); + }); + TextLayerBuilder.#textLayers.set(div, end); + TextLayerBuilder.#enableGlobalSelectionListener(); + } + static #removeGlobalSelectionListener(textLayerDiv) { + this.#textLayers.delete(textLayerDiv); + if (this.#textLayers.size === 0) { + this.#selectionChangeAbortController?.abort(); + this.#selectionChangeAbortController = null; + } + } + static #enableGlobalSelectionListener() { + if (this.#selectionChangeAbortController) { + return; + } + this.#selectionChangeAbortController = new AbortController(); + const { + signal + } = this.#selectionChangeAbortController; + const reset = (end, textLayer) => { + textLayer.append(end); + end.style.width = ""; + end.style.height = ""; + textLayer.classList.remove("selecting"); + }; + let isPointerDown = false; + document.addEventListener("pointerdown", () => { + isPointerDown = true; + }, { + signal + }); + document.addEventListener("pointerup", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + window.addEventListener("blur", () => { + isPointerDown = false; + this.#textLayers.forEach(reset); + }, { + signal + }); + document.addEventListener("keyup", () => { + if (!isPointerDown) { + this.#textLayers.forEach(reset); + } + }, { + signal + }); + var isFirefox, prevRange; + document.addEventListener("selectionchange", () => { + const selection = document.getSelection(); + if (selection.rangeCount === 0) { + this.#textLayers.forEach(reset); + return; + } + const activeTextLayers = new Set(); + for (let i = 0; i < selection.rangeCount; i++) { + const range = selection.getRangeAt(i); + for (const textLayerDiv of this.#textLayers.keys()) { + if (!activeTextLayers.has(textLayerDiv) && range.intersectsNode(textLayerDiv)) { + activeTextLayers.add(textLayerDiv); + } + } + } + for (const [textLayerDiv, endDiv] of this.#textLayers) { + if (activeTextLayers.has(textLayerDiv)) { + textLayerDiv.classList.add("selecting"); + } else { + reset(endDiv, textLayerDiv); + } + } + isFirefox ??= getComputedStyle(this.#textLayers.values().next().value).getPropertyValue("-moz-user-select") === "none"; + if (isFirefox) { + return; + } + const range = selection.getRangeAt(0); + const modifyStart = prevRange && (range.compareBoundaryPoints(Range.END_TO_END, prevRange) === 0 || range.compareBoundaryPoints(Range.START_TO_END, prevRange) === 0); + let anchor = modifyStart ? range.startContainer : range.endContainer; + if (anchor.nodeType === Node.TEXT_NODE) { + anchor = anchor.parentNode; + } + if (!modifyStart && range.endOffset === 0) { + do { + while (!anchor.previousSibling) { + anchor = anchor.parentNode; + } + anchor = anchor.previousSibling; + } while (!anchor.childNodes.length); + } + const parentTextLayer = anchor.parentElement?.closest(".textLayer"); + const endDiv = this.#textLayers.get(parentTextLayer); + if (endDiv) { + endDiv.style.width = parentTextLayer.style.width; + endDiv.style.height = parentTextLayer.style.height; + anchor.parentElement.insertBefore(endDiv, modifyStart ? anchor : anchor.nextSibling); + } + prevRange = range.cloneRange(); + }, { + signal + }); + } +} + +;// ./web/pdf_page_view.js + + + + + + + + + + + + + + + + +const DEFAULT_LAYER_PROPERTIES = null; +const LAYERS_ORDER = new Map([["canvasWrapper", 0], ["textLayer", 1], ["annotationLayer", 2], ["annotationEditorLayer", 3], ["xfaLayer", 3]]); +class PDFPageView extends BasePDFPageView { + #annotationMode = AnnotationMode.ENABLE_FORMS; + #canvasWrapper = null; + #commentManager = null; + #enableAutoLinking = true; + #hasRestrictedScaling = false; + #isEditing = false; + #layerProperties = null; + #needsRestrictedScaling = false; + #originalViewport = null; + #previousRotation = null; + #scaleRoundX = 1; + #scaleRoundY = 1; + #textLayerMode = TextLayerMode.ENABLE; + #userUnit = 1; + #useThumbnailCanvas = { + directDrawing: true, + initialOptionalContent: true, + regularAnnotations: true + }; + #layers = [null, null, null, null]; + constructor(options) { + super(options); + const container = options.container; + const defaultViewport = options.defaultViewport; + this.renderingId = "page" + this.id; + this.#layerProperties = options.layerProperties || DEFAULT_LAYER_PROPERTIES; + this.pdfPage = null; + this.pageLabel = null; + this.rotation = 0; + this.scale = options.scale || DEFAULT_SCALE; + this.viewport = defaultViewport; + this.pdfPageRotate = defaultViewport.rotation; + this._optionalContentConfigPromise = options.optionalContentConfigPromise || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.maxCanvasPixels = options.maxCanvasPixels ?? AppOptions.get("maxCanvasPixels"); + this.maxCanvasDim = options.maxCanvasDim || AppOptions.get("maxCanvasDim"); + this.capCanvasAreaFactor = options.capCanvasAreaFactor ?? AppOptions.get("capCanvasAreaFactor"); + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#commentManager = options.commentManager || null; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this._isStandalone = !this.renderingQueue?.hasViewer(); + this._container = container; + this._annotationCanvasMap = null; + this.annotationLayer = null; + this.annotationEditorLayer = null; + this.textLayer = null; + this.xfaLayer = null; + this.structTreeLayer = null; + this.drawLayer = null; + this.detailView = null; + const div = document.createElement("div"); + div.className = "page"; + div.setAttribute("data-page-number", this.id); + div.setAttribute("role", "region"); + div.setAttribute("data-l10n-id", "pdfjs-page-landmark"); + div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.id + })); + this.div = div; + this.#setDimensions(); + container?.append(div); + if (this._isStandalone) { + container?.style.setProperty("--scale-factor", this.scale * PixelsPerInch.PDF_TO_CSS_UNITS); + if (this.pageColors?.background) { + container?.style.setProperty("--page-bg-color", this.pageColors.background); + } + const { + optionalContentConfigPromise + } = options; + if (optionalContentConfigPromise) { + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + if (!options.l10n) { + this.l10n.translate(this.div); + } + } + } + #addLayer(div, name) { + const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; + this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } + for (let i = pos - 1; i >= 0; i--) { + const layer = this.#layers[i]; + if (layer) { + layer.after(div); + return; + } + } + this.div.prepend(div); + } + #setDimensions() { + const { + div, + viewport + } = this; + if (viewport.userUnit !== this.#userUnit) { + if (viewport.userUnit !== 1) { + div.style.setProperty("--user-unit", viewport.userUnit); + } else { + div.style.removeProperty("--user-unit"); + } + this.#userUnit = viewport.userUnit; + } + if (this.pdfPage) { + if (this.#previousRotation === viewport.rotation) { + return; + } + this.#previousRotation = viewport.rotation; + } + setLayerDimensions(div, viewport, true, false); + } + setPdfPage(pdfPage) { + if (this._isStandalone && (this.pageColors?.foreground === "CanvasText" || this.pageColors?.background === "Canvas")) { + this._container?.style.setProperty("--hcm-highlight-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + this._container?.style.setProperty("--hcm-highlight-selected-filter", pdfPage.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "Highlight")); + } + this.pdfPage = pdfPage; + this.pdfPageRotate = pdfPage.rotate; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = pdfPage.getViewport({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + this.reset(); + } + destroy() { + this.reset(); + this.pdfPage?.cleanup(); + } + hasEditableAnnotations() { + return !!this.annotationLayer?.hasEditableAnnotations(); + } + get _textHighlighter() { + return shadow(this, "_textHighlighter", new TextHighlighter({ + pageIndex: this.id - 1, + eventBus: this.eventBus, + findController: this.#layerProperties.findController + })); + } + #dispatchLayerRendered(name, error) { + this.eventBus.dispatch(name, { + source: this, + pageNumber: this.id, + error + }); + } + async #renderAnnotationLayer() { + let error = null; + try { + await this.annotationLayer.render({ + viewport: this.viewport, + intent: "display", + structTreeLayer: this.structTreeLayer + }); + } catch (ex) { + console.error("#renderAnnotationLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationlayerrendered", error); + } + } + async #renderAnnotationEditorLayer() { + let error = null; + try { + await this.annotationEditorLayer.render({ + viewport: this.viewport, + intent: "display" + }); + } catch (ex) { + console.error("#renderAnnotationEditorLayer:", ex); + error = ex; + } finally { + this.#dispatchLayerRendered("annotationeditorlayerrendered", error); + } + } + async #renderDrawLayer() { + try { + await this.drawLayer.render({ + intent: "display" + }); + } catch (ex) { + console.error("#renderDrawLayer:", ex); + } + } + async #renderXfaLayer() { + let error = null; + try { + const result = await this.xfaLayer.render({ + viewport: this.viewport, + intent: "display" + }); + if (result?.textDivs && this._textHighlighter) { + this.#buildXfaTextContentItems(result.textDivs); + } + } catch (ex) { + console.error("#renderXfaLayer:", ex); + error = ex; + } finally { + if (this.xfaLayer?.div) { + this.l10n.pause(); + this.#addLayer(this.xfaLayer.div, "xfaLayer"); + this.l10n.resume(); + } + this.#dispatchLayerRendered("xfalayerrendered", error); + } + } + async #renderTextLayer() { + if (!this.textLayer) { + return; + } + let error = null; + try { + await this.textLayer.render({ + viewport: this.viewport + }); + } catch (ex) { + if (ex instanceof AbortException) { + return; + } + console.error("#renderTextLayer:", ex); + error = ex; + } + this.#dispatchLayerRendered("textlayerrendered", error); + this.#renderStructTreeLayer(); + } + async #renderStructTreeLayer() { + if (!this.textLayer) { + return; + } + const treeDom = await this.structTreeLayer?.render(); + if (treeDom) { + this.l10n.pause(); + this.structTreeLayer?.addElementsToTextLayer(); + if (this.canvas && treeDom.parentNode !== this.canvas) { + this.canvas.append(treeDom); + } + this.l10n.resume(); + } + this.structTreeLayer?.show(); + } + async #buildXfaTextContentItems(textDivs) { + const text = await this.pdfPage.getTextContent(); + const items = []; + for (const item of text.items) { + items.push(item.str); + } + this._textHighlighter.setTextMapping(textDivs, items); + this._textHighlighter.enable(); + } + async #injectLinkAnnotations(textLayerPromise) { + let error = null; + try { + await textLayerPromise; + if (!this.annotationLayer) { + return; + } + await this.annotationLayer.injectLinkAnnotations(Autolinker.processLinks(this)); + } catch (ex) { + console.error("#injectLinkAnnotations:", ex); + error = ex; + } + } + _resetCanvas() { + super._resetCanvas(); + this.#originalViewport = null; + } + reset({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + keepCanvasWrapper = false, + preserveDetailViewState = false + } = {}) { + const keepPdfBugGroups = this.pdfPage?._pdfBug ?? false; + this.cancelRendering({ + keepAnnotationLayer, + keepAnnotationEditorLayer, + keepXfaLayer, + keepTextLayer + }); + this.renderingState = RenderingStates.INITIAL; + const div = this.div; + const childNodes = div.childNodes, + annotationLayerNode = keepAnnotationLayer && this.annotationLayer?.div || null, + annotationEditorLayerNode = keepAnnotationEditorLayer && this.annotationEditorLayer?.div || null, + xfaLayerNode = keepXfaLayer && this.xfaLayer?.div || null, + textLayerNode = keepTextLayer && this.textLayer?.div || null, + canvasWrapperNode = keepCanvasWrapper && this.#canvasWrapper || null; + for (let i = childNodes.length - 1; i >= 0; i--) { + const node = childNodes[i]; + switch (node) { + case annotationLayerNode: + case annotationEditorLayerNode: + case xfaLayerNode: + case textLayerNode: + case canvasWrapperNode: + continue; + } + if (keepPdfBugGroups && node.classList.contains("pdfBugGroupsLayer")) { + continue; + } + node.remove(); + const layerIndex = this.#layers.indexOf(node); + if (layerIndex >= 0) { + this.#layers[layerIndex] = null; + } + } + div.removeAttribute("data-loaded"); + if (annotationLayerNode) { + this.annotationLayer.hide(); + } + if (annotationEditorLayerNode) { + this.annotationEditorLayer.hide(); + } + if (xfaLayerNode) { + this.xfaLayer.hide(); + } + if (textLayerNode) { + this.textLayer.hide(); + } + this.structTreeLayer?.hide(); + if (!keepCanvasWrapper && this.#canvasWrapper) { + this.#canvasWrapper = null; + this._resetCanvas(); + } + if (!preserveDetailViewState) { + this.detailView?.reset({ + keepCanvas: keepCanvasWrapper + }); + if (!keepCanvasWrapper) { + this.detailView = null; + } + } + } + toggleEditingMode(isEditing) { + this.#isEditing = isEditing; + if (!this.hasEditableAnnotations()) { + return; + } + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true + }); + } + updateVisibleArea(visibleArea) { + if (this.enableDetailCanvas) { + if (this.#needsRestrictedScaling && this.maxCanvasPixels > 0 && visibleArea) { + this.detailView ??= new PDFPageDetailView({ + pageView: this, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering + }); + this.detailView.update({ + visibleArea + }); + } else if (this.detailView) { + this.detailView.reset(); + this.detailView = null; + } + } + } + update({ + scale = 0, + rotation = null, + optionalContentConfigPromise = null, + drawingDelay = -1 + }) { + this.scale = scale || this.scale; + if (typeof rotation === "number") { + this.rotation = rotation; + } + if (optionalContentConfigPromise instanceof Promise) { + this._optionalContentConfigPromise = optionalContentConfigPromise; + optionalContentConfigPromise.then(optionalContentConfig => { + if (optionalContentConfigPromise !== this._optionalContentConfigPromise) { + return; + } + this.#useThumbnailCanvas.initialOptionalContent = optionalContentConfig.hasInitialVisibility; + }); + } + this.#useThumbnailCanvas.directDrawing = true; + const totalRotation = (this.rotation + this.pdfPageRotate) % 360; + this.viewport = this.viewport.clone({ + scale: this.scale * PixelsPerInch.PDF_TO_CSS_UNITS, + rotation: totalRotation + }); + this.#setDimensions(); + if (this._isStandalone) { + this._container?.style.setProperty("--scale-factor", this.viewport.scale); + } + this.#computeScale(); + if (this.canvas) { + const onlyCssZoom = this.#hasRestrictedScaling && this.#needsRestrictedScaling; + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + if (postponeDrawing || onlyCssZoom) { + if (postponeDrawing && !onlyCssZoom && this.renderingState !== RenderingStates.FINISHED) { + this.cancelRendering({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + cancelExtraDelay: drawingDelay + }); + this.renderingState = RenderingStates.FINISHED; + this.#useThumbnailCanvas.directDrawing = false; + } + this.cssTransform({ + redrawAnnotationLayer: true, + redrawAnnotationEditorLayer: true, + redrawXfaLayer: true, + redrawTextLayer: !postponeDrawing, + hideTextLayer: postponeDrawing + }); + if (!postponeDrawing) { + this.detailView?.update({ + underlyingViewUpdated: true + }); + this.dispatchPageRendered(true, false); + } + return; + } + } + this.cssTransform({}); + this.reset({ + keepAnnotationLayer: true, + keepAnnotationEditorLayer: true, + keepXfaLayer: true, + keepTextLayer: true, + keepCanvasWrapper: true, + preserveDetailViewState: true + }); + this.detailView?.update({ + underlyingViewUpdated: true + }); + } + #computeScale() { + const { + width, + height + } = this.viewport; + const outputScale = this.outputScale = new OutputScale(); + if (this.maxCanvasPixels === 0) { + const invScale = 1 / this.scale; + outputScale.sx *= invScale; + outputScale.sy *= invScale; + this.#needsRestrictedScaling = true; + } else { + this.#needsRestrictedScaling = outputScale.limitCanvas(width, height, this.maxCanvasPixels, this.maxCanvasDim, this.capCanvasAreaFactor); + if (this.#needsRestrictedScaling && this.enableDetailCanvas) { + const factor = this.enableOptimizedPartialRendering ? 4 : 2; + outputScale.sx /= factor; + outputScale.sy /= factor; + } + } + } + cancelRendering({ + keepAnnotationLayer = false, + keepAnnotationEditorLayer = false, + keepXfaLayer = false, + keepTextLayer = false, + cancelExtraDelay = 0 + } = {}) { + super.cancelRendering({ + cancelExtraDelay + }); + if (this.textLayer && (!keepTextLayer || !this.textLayer.div)) { + this.textLayer.cancel(); + this.textLayer = null; + } + if (this.annotationLayer && (!keepAnnotationLayer || !this.annotationLayer.div)) { + this.annotationLayer.cancel(); + this.annotationLayer = null; + this._annotationCanvasMap = null; + } + if (this.structTreeLayer && !this.textLayer) { + this.structTreeLayer = null; + } + if (this.annotationEditorLayer && (!keepAnnotationEditorLayer || !this.annotationEditorLayer.div)) { + if (this.drawLayer) { + this.drawLayer.cancel(); + this.drawLayer = null; + } + this.annotationEditorLayer.cancel(); + this.annotationEditorLayer = null; + } + if (this.xfaLayer && (!keepXfaLayer || !this.xfaLayer.div)) { + this.xfaLayer.cancel(); + this.xfaLayer = null; + this._textHighlighter?.disable(); + } + } + cssTransform({ + redrawAnnotationLayer = false, + redrawAnnotationEditorLayer = false, + redrawXfaLayer = false, + redrawTextLayer = false, + hideTextLayer = false + }) { + const { + canvas + } = this; + if (!canvas) { + return; + } + const originalViewport = this.#originalViewport; + if (this.viewport !== originalViewport) { + const relativeRotation = (360 + this.viewport.rotation - originalViewport.rotation) % 360; + if (relativeRotation === 90 || relativeRotation === 270) { + const { + width, + height + } = this.viewport; + const scaleX = height / width; + const scaleY = width / height; + canvas.style.transform = `rotate(${relativeRotation}deg) scale(${scaleX},${scaleY})`; + } else { + canvas.style.transform = relativeRotation === 0 ? "" : `rotate(${relativeRotation}deg)`; + } + } + if (redrawAnnotationLayer && this.annotationLayer) { + this.#renderAnnotationLayer(); + } + if (redrawAnnotationEditorLayer && this.annotationEditorLayer) { + if (this.drawLayer) { + this.#renderDrawLayer(); + } + this.#renderAnnotationEditorLayer(); + } + if (redrawXfaLayer && this.xfaLayer) { + this.#renderXfaLayer(); + } + if (this.textLayer) { + if (hideTextLayer) { + this.textLayer.hide(); + this.structTreeLayer?.hide(); + } else if (redrawTextLayer) { + this.#renderTextLayer(); + } + } + } + get width() { + return this.viewport.width; + } + get height() { + return this.viewport.height; + } + getPagePoint(x, y) { + return this.viewport.convertToPdfPoint(x, y); + } + _ensureCanvasWrapper() { + let canvasWrapper = this.#canvasWrapper; + if (!canvasWrapper) { + canvasWrapper = this.#canvasWrapper = document.createElement("div"); + canvasWrapper.classList.add("canvasWrapper"); + this.#addLayer(canvasWrapper, "canvasWrapper"); + } + return canvasWrapper; + } + _getRenderingContext(canvas, transform, recordOperations) { + return { + canvas, + transform, + viewport: this.viewport, + annotationMode: this.#annotationMode, + optionalContentConfigPromise: this._optionalContentConfigPromise, + annotationCanvasMap: this._annotationCanvasMap, + pageColors: this.pageColors, + isEditing: this.#isEditing, + recordOperations + }; + } + async draw() { + if (this.renderingState !== RenderingStates.INITIAL) { + console.error("Must be in new state before drawing"); + this.reset(); + } + const { + div, + l10n, + pdfPage, + viewport + } = this; + if (!pdfPage) { + this.renderingState = RenderingStates.FINISHED; + throw new Error("pdfPage is not loaded"); + } + this.renderingState = RenderingStates.RUNNING; + const canvasWrapper = this._ensureCanvasWrapper(); + if (!this.textLayer && this.#textLayerMode !== TextLayerMode.DISABLE && !pdfPage.isPureXfa) { + this._accessibilityManager ||= new TextAccessibilityManager(); + this.textLayer = new TextLayerBuilder({ + pdfPage, + highlighter: this._textHighlighter, + accessibilityManager: this._accessibilityManager, + enablePermissions: this.#textLayerMode === TextLayerMode.ENABLE_PERMISSIONS, + onAppend: textLayerDiv => { + this.l10n.pause(); + this.#addLayer(textLayerDiv, "textLayer"); + this.l10n.resume(); + } + }); + } + if (!this.annotationLayer && this.#annotationMode !== AnnotationMode.DISABLE) { + const { + annotationStorage, + annotationEditorUIManager, + downloadManager, + enableComment, + enableScripting, + fieldObjectsPromise, + hasJSActionsPromise, + linkService + } = this.#layerProperties; + this._annotationCanvasMap ||= new Map(); + this.annotationLayer = new AnnotationLayerBuilder({ + pdfPage, + annotationStorage, + imageResourcesPath: this.imageResourcesPath, + renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, + linkService, + downloadManager, + enableComment, + enableScripting, + hasJSActionsPromise, + fieldObjectsPromise, + annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, + annotationEditorUIManager, + commentManager: this.#commentManager, + onAppend: annotationLayerDiv => { + this.#addLayer(annotationLayerDiv, "annotationLayer"); + } + }); + } + const { + width, + height + } = viewport; + this.#originalViewport = viewport; + const { + canvas, + prevCanvas + } = this._createCanvas(newCanvas => { + canvasWrapper.prepend(newCanvas); + }); + canvas.setAttribute("role", "presentation"); + if (!this.outputScale) { + this.#computeScale(); + } + const { + outputScale + } = this; + this.#hasRestrictedScaling = this.#needsRestrictedScaling; + const sfx = approximateFraction(outputScale.sx); + const sfy = approximateFraction(outputScale.sy); + const canvasWidth = canvas.width = floorToDivide(calcRound(width * outputScale.sx), sfx[0]); + const canvasHeight = canvas.height = floorToDivide(calcRound(height * outputScale.sy), sfy[0]); + const pageWidth = floorToDivide(calcRound(width), sfx[1]); + const pageHeight = floorToDivide(calcRound(height), sfy[1]); + outputScale.sx = canvasWidth / pageWidth; + outputScale.sy = canvasHeight / pageHeight; + if (this.#scaleRoundX !== sfx[1]) { + div.style.setProperty("--scale-round-x", `${sfx[1]}px`); + this.#scaleRoundX = sfx[1]; + } + if (this.#scaleRoundY !== sfy[1]) { + div.style.setProperty("--scale-round-y", `${sfy[1]}px`); + this.#scaleRoundY = sfy[1]; + } + const recordBBoxes = this.enableOptimizedPartialRendering && this.#hasRestrictedScaling && !this.recordedBBoxes; + const transform = outputScale.scaled ? [outputScale.sx, 0, 0, outputScale.sy, 0, 0] : null; + const resultPromise = this._drawCanvas(this._getRenderingContext(canvas, transform, recordBBoxes), () => { + prevCanvas?.remove(); + this._resetCanvas(); + }, renderTask => { + this.#useThumbnailCanvas.regularAnnotations = !renderTask.separateAnnots; + this.dispatchPageRendered(false, false); + }).then(async () => { + if (this.renderingState !== RenderingStates.FINISHED) { + return; + } + this.structTreeLayer ||= new StructTreeLayerBuilder(pdfPage, viewport.rawDims); + const textLayerPromise = this.#renderTextLayer(); + if (this.annotationLayer) { + await this.#renderAnnotationLayer(); + if (this.#enableAutoLinking && this.annotationLayer && this.textLayer) { + await this.#injectLinkAnnotations(textLayerPromise); + } + } + const { + annotationEditorUIManager + } = this.#layerProperties; + if (!annotationEditorUIManager) { + return; + } + this.drawLayer ||= new DrawLayerBuilder({ + pageIndex: this.id + }); + await this.#renderDrawLayer(); + this.drawLayer.setParent(canvasWrapper); + if (this.annotationLayer || this.#annotationMode === AnnotationMode.DISABLE) { + this.annotationEditorLayer ||= new AnnotationEditorLayerBuilder({ + uiManager: annotationEditorUIManager, + pdfPage, + l10n, + structTreeLayer: this.structTreeLayer, + accessibilityManager: this._accessibilityManager, + annotationLayer: this.annotationLayer?.annotationLayer, + textLayer: this.textLayer, + drawLayer: this.drawLayer.getDrawLayer(), + onAppend: annotationEditorLayerDiv => { + this.#addLayer(annotationEditorLayerDiv, "annotationEditorLayer"); + } + }); + this.#renderAnnotationEditorLayer(); + } + }); + if (pdfPage.isPureXfa) { + if (!this.xfaLayer) { + const { + annotationStorage, + linkService + } = this.#layerProperties; + this.xfaLayer = new XfaLayerBuilder({ + pdfPage, + annotationStorage, + linkService + }); + } + this.#renderXfaLayer(); + } + div.setAttribute("data-loaded", true); + this.dispatchPageRender(); + return resultPromise; + } + setPageLabel(label) { + this.pageLabel = typeof label === "string" ? label : null; + this.div.setAttribute("data-l10n-args", JSON.stringify({ + page: this.pageLabel ?? this.id + })); + if (this.pageLabel !== null) { + this.div.setAttribute("data-page-label", this.pageLabel); + } else { + this.div.removeAttribute("data-page-label"); + } + } + get thumbnailCanvas() { + const { + directDrawing, + initialOptionalContent, + regularAnnotations + } = this.#useThumbnailCanvas; + return directDrawing && initialOptionalContent && regularAnnotations ? this.canvas : null; + } +} + +;// ./web/pdf_viewer.js + + + + + + +const DEFAULT_CACHE_SIZE = 10; +const PagesCountLimit = { + FORCE_SCROLL_MODE_PAGE: 10000, + FORCE_LAZY_PAGE_INIT: 5000, + PAUSE_EAGER_PAGE_INIT: 250 +}; +function isValidAnnotationEditorMode(mode) { + return Object.values(AnnotationEditorType).includes(mode) && mode !== AnnotationEditorType.DISABLE; +} +class PDFPageViewBuffer { + #buf = new Set(); + #size = 0; + constructor(size) { + this.#size = size; + } + push(view) { + const buf = this.#buf; + if (buf.has(view)) { + buf.delete(view); + } + buf.add(view); + if (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + resize(newSize, idsToKeep = null) { + this.#size = newSize; + const buf = this.#buf; + if (idsToKeep) { + const ii = buf.size; + let i = 1; + for (const view of buf) { + if (idsToKeep.has(view.id)) { + buf.delete(view); + buf.add(view); + } + if (++i > ii) { + break; + } + } + } + while (buf.size > this.#size) { + this.#destroyFirstView(); + } + } + has(view) { + return this.#buf.has(view); + } + [Symbol.iterator]() { + return this.#buf.keys(); + } + #destroyFirstView() { + const firstView = this.#buf.keys().next().value; + firstView?.destroy(); + this.#buf.delete(firstView); + } +} +class PDFViewer { + #buffer = null; + #altTextManager = null; + #annotationEditorHighlightColors = null; + #annotationEditorMode = AnnotationEditorType.NONE; + #annotationEditorUIManager = null; + #annotationMode = AnnotationMode.ENABLE_FORMS; + #commentManager = null; + #containerTopLeft = null; + #editorUndoBar = null; + #enableHWA = false; + #enableHighlightFloatingButton = false; + #enablePermissions = false; + #enableUpdatedAddImage = false; + #enableNewAltTextWhenAddingImage = false; + #enableAutoLinking = true; + #eventAbortController = null; + #minDurationToUpdateCanvas = 0; + #mlManager = null; + #printingAllowed = true; + #scrollTimeoutId = null; + #switchAnnotationEditorModeAC = null; + #switchAnnotationEditorModeTimeoutId = null; + #getAllTextInProgress = false; + #hiddenCopyElement = null; + #interruptCopyCondition = false; + #previousContainerHeight = 0; + #resizeObserver = new ResizeObserver(this.#resizeObserverCallback.bind(this)); + #scrollModePageState = null; + #scaleTimeoutId = null; + #signatureManager = null; + #supportsPinchToZoom = true; + #textLayerMode = TextLayerMode.ENABLE; + #viewerAlert = null; + constructor(options) { + const viewerVersion = "5.4.296"; + if (version !== viewerVersion) { + throw new Error(`The API version "${version}" does not match the Viewer version "${viewerVersion}".`); + } + this.container = options.container; + this.viewer = options.viewer || options.container.firstElementChild; + this.#viewerAlert = options.viewerAlert || null; + if (this.container?.tagName !== "DIV" || this.viewer?.tagName !== "DIV") { + throw new Error("Invalid `container` and/or `viewer` option."); + } + if (this.container.offsetParent && getComputedStyle(this.container).position !== "absolute") { + throw new Error("The `container` must be absolutely positioned."); + } + this.#resizeObserver.observe(this.container); + this.eventBus = options.eventBus; + this.linkService = options.linkService || new SimpleLinkService(); + this.downloadManager = options.downloadManager || null; + this.findController = options.findController || null; + this.#altTextManager = options.altTextManager || null; + this.#commentManager = options.commentManager || null; + this.#signatureManager = options.signatureManager || null; + this.#editorUndoBar = options.editorUndoBar || null; + if (this.findController) { + this.findController.onIsPageVisible = pageNumber => this._getVisiblePages().ids.has(pageNumber); + } + this._scriptingManager = options.scriptingManager || null; + this.#textLayerMode = options.textLayerMode ?? TextLayerMode.ENABLE; + this.#annotationMode = options.annotationMode ?? AnnotationMode.ENABLE_FORMS; + this.#annotationEditorMode = options.annotationEditorMode ?? AnnotationEditorType.NONE; + this.#annotationEditorHighlightColors = options.annotationEditorHighlightColors || null; + this.#enableHighlightFloatingButton = options.enableHighlightFloatingButton === true; + this.#enableUpdatedAddImage = options.enableUpdatedAddImage === true; + this.#enableNewAltTextWhenAddingImage = options.enableNewAltTextWhenAddingImage === true; + this.imageResourcesPath = options.imageResourcesPath || ""; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; + this.removePageBorders = options.removePageBorders || false; + this.maxCanvasPixels = options.maxCanvasPixels; + this.maxCanvasDim = options.maxCanvasDim; + this.capCanvasAreaFactor = options.capCanvasAreaFactor; + this.enableDetailCanvas = options.enableDetailCanvas ?? true; + this.enableOptimizedPartialRendering = options.enableOptimizedPartialRendering ?? false; + this.l10n = options.l10n; + this.l10n ||= new genericl10n_GenericL10n(); + this.#enablePermissions = options.enablePermissions || false; + this.pageColors = options.pageColors || null; + this.#mlManager = options.mlManager || null; + this.#enableHWA = options.enableHWA || false; + this.#supportsPinchToZoom = options.supportsPinchToZoom !== false; + this.#enableAutoLinking = options.enableAutoLinking !== false; + this.#minDurationToUpdateCanvas = options.minDurationToUpdateCanvas ?? 500; + this.defaultRenderingQueue = !options.renderingQueue; + if (this.defaultRenderingQueue) { + this.renderingQueue = new PDFRenderingQueue(); + this.renderingQueue.setViewer(this); + } else { + this.renderingQueue = options.renderingQueue; + } + const { + abortSignal + } = options; + abortSignal?.addEventListener("abort", () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, { + once: true + }); + this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this), abortSignal); + this.presentationModeState = PresentationModeState.UNKNOWN; + this._resetView(); + if (this.removePageBorders) { + this.viewer.classList.add("removePageBorders"); + } + this.#updateContainerHeightCss(); + this.eventBus._on("thumbnailrendered", ({ + pageNumber, + pdfPage + }) => { + const pageView = this._pages[pageNumber - 1]; + if (!this.#buffer.has(pageView)) { + pdfPage?.cleanup(); + } + }); + if (!options.l10n) { + this.l10n.translate(this.container); + } + } + get printingAllowed() { + return this.#printingAllowed; + } + get pagesCount() { + return this._pages.length; + } + getPageView(index) { + return this._pages[index]; + } + getCachedPageViews() { + return new Set(this.#buffer); + } + get pageViewsReady() { + return this._pages.every(pageView => pageView?.pdfPage); + } + get renderForms() { + return this.#annotationMode === AnnotationMode.ENABLE_FORMS; + } + get enableScripting() { + return !!this._scriptingManager; + } + get currentPageNumber() { + return this._currentPageNumber; + } + set currentPageNumber(val) { + if (!Number.isInteger(val)) { + throw new Error("Invalid page number."); + } + if (!this.pdfDocument) { + return; + } + if (!this._setCurrentPageNumber(val, true)) { + console.error(`currentPageNumber: "${val}" is not a valid page.`); + } + } + _setCurrentPageNumber(val, resetCurrentPageView = false) { + if (this._currentPageNumber === val) { + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + if (!(0 < val && val <= this.pagesCount)) { + return false; + } + const previous = this._currentPageNumber; + this._currentPageNumber = val; + this.eventBus.dispatch("pagechanging", { + source: this, + pageNumber: val, + pageLabel: this._pageLabels?.[val - 1] ?? null, + previous + }); + if (resetCurrentPageView) { + this.#resetCurrentPageView(); + } + return true; + } + get currentPageLabel() { + return this._pageLabels?.[this._currentPageNumber - 1] ?? null; + } + set currentPageLabel(val) { + if (!this.pdfDocument) { + return; + } + let page = val | 0; + if (this._pageLabels) { + const i = this._pageLabels.indexOf(val); + if (i >= 0) { + page = i + 1; + } + } + if (!this._setCurrentPageNumber(page, true)) { + console.error(`currentPageLabel: "${val}" is not a valid page.`); + } + } + get currentScale() { + return this._currentScale !== UNKNOWN_SCALE ? this._currentScale : DEFAULT_SCALE; + } + set currentScale(val) { + if (isNaN(val)) { + throw new Error("Invalid numeric scale."); + } + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get currentScaleValue() { + return this._currentScaleValue; + } + set currentScaleValue(val) { + if (!this.pdfDocument) { + return; + } + this.#setScale(val, { + noScroll: false + }); + } + get pagesRotation() { + return this._pagesRotation; + } + set pagesRotation(rotation) { + if (!isValidRotation(rotation)) { + throw new Error("Invalid pages rotation angle."); + } + if (!this.pdfDocument) { + return; + } + rotation %= 360; + if (rotation < 0) { + rotation += 360; + } + if (this._pagesRotation === rotation) { + return; + } + this._pagesRotation = rotation; + const pageNumber = this._currentPageNumber; + this.refresh(true, { + rotation + }); + if (this._currentScaleValue) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.eventBus.dispatch("rotationchanging", { + source: this, + pagesRotation: rotation, + pageNumber + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get firstPagePromise() { + return this.pdfDocument ? this._firstPageCapability.promise : null; + } + get onePageRendered() { + return this.pdfDocument ? this._onePageRenderedCapability.promise : null; + } + get pagesPromise() { + return this.pdfDocument ? this._pagesCapability.promise : null; + } + get _layerProperties() { + const self = this; + return shadow(this, "_layerProperties", { + get annotationEditorUIManager() { + return self.#annotationEditorUIManager; + }, + get annotationStorage() { + return self.pdfDocument?.annotationStorage; + }, + get downloadManager() { + return self.downloadManager; + }, + get enableComment() { + return !!self.#commentManager; + }, + get enableScripting() { + return !!self._scriptingManager; + }, + get fieldObjectsPromise() { + return self.pdfDocument?.getFieldObjects(); + }, + get findController() { + return self.findController; + }, + get hasJSActionsPromise() { + return self.pdfDocument?.hasJSActions(); + }, + get linkService() { + return self.linkService; + } + }); + } + #initializePermissions(permissions) { + const params = { + annotationEditorMode: this.#annotationEditorMode, + annotationMode: this.#annotationMode, + textLayerMode: this.#textLayerMode + }; + if (!permissions) { + this.#printingAllowed = true; + this.eventBus.dispatch("printingallowed", { + source: this, + isAllowed: this.#printingAllowed + }); + return params; + } + this.#printingAllowed = permissions.includes(PermissionFlag.PRINT_HIGH_QUALITY) || permissions.includes(PermissionFlag.PRINT); + this.eventBus.dispatch("printingallowed", { + source: this, + isAllowed: this.#printingAllowed + }); + if (!permissions.includes(PermissionFlag.COPY) && this.#textLayerMode === TextLayerMode.ENABLE) { + params.textLayerMode = TextLayerMode.ENABLE_PERMISSIONS; + } + if (!permissions.includes(PermissionFlag.MODIFY_CONTENTS)) { + params.annotationEditorMode = AnnotationEditorType.DISABLE; + } + if (!permissions.includes(PermissionFlag.MODIFY_ANNOTATIONS) && !permissions.includes(PermissionFlag.FILL_INTERACTIVE_FORMS) && this.#annotationMode === AnnotationMode.ENABLE_FORMS) { + params.annotationMode = AnnotationMode.ENABLE; + } + return params; + } + async #onePageRenderedOrForceFetch(signal) { + if (document.visibilityState === "hidden" || !this.container.offsetParent || this._getVisiblePages().views.length === 0) { + return; + } + const hiddenCapability = Promise.withResolvers(), + ac = new AbortController(); + document.addEventListener("visibilitychange", () => { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + }, { + signal: AbortSignal.any([signal, ac.signal]) + }); + await Promise.race([this._onePageRenderedCapability.promise, hiddenCapability.promise]); + ac.abort(); + } + async getAllText() { + const texts = []; + const buffer = []; + for (let pageNum = 1, pagesCount = this.pdfDocument.numPages; pageNum <= pagesCount; ++pageNum) { + if (this.#interruptCopyCondition) { + return null; + } + buffer.length = 0; + const page = await this.pdfDocument.getPage(pageNum); + const { + items + } = await page.getTextContent(); + for (const item of items) { + if (item.str) { + buffer.push(item.str); + } + if (item.hasEOL) { + buffer.push("\n"); + } + } + texts.push(removeNullCharacters(buffer.join(""))); + } + return texts.join("\n"); + } + #copyCallback(textLayerMode, event) { + const selection = document.getSelection(); + const { + focusNode, + anchorNode + } = selection; + if (anchorNode && focusNode && selection.containsNode(this.#hiddenCopyElement)) { + if (this.#getAllTextInProgress || textLayerMode === TextLayerMode.ENABLE_PERMISSIONS) { + stopEvent(event); + return; + } + this.#getAllTextInProgress = true; + const { + classList + } = this.viewer; + classList.add("copyAll"); + const ac = new AbortController(); + window.addEventListener("keydown", ev => this.#interruptCopyCondition = ev.key === "Escape", { + signal: ac.signal + }); + this.getAllText().then(async text => { + if (text !== null) { + await navigator.clipboard.writeText(text); + } + }).catch(reason => { + console.warn(`Something goes wrong when extracting the text: ${reason.message}`); + }).finally(() => { + this.#getAllTextInProgress = false; + this.#interruptCopyCondition = false; + ac.abort(); + classList.remove("copyAll"); + }); + stopEvent(event); + } + } + setDocument(pdfDocument) { + if (this.pdfDocument) { + this.eventBus.dispatch("pagesdestroy", { + source: this + }); + this._cancelRendering(); + this._resetView(); + this.findController?.setDocument(null); + this._scriptingManager?.setDocument(null); + this.#annotationEditorUIManager?.destroy(); + this.#annotationEditorUIManager = null; + this.#annotationEditorMode = AnnotationEditorType.NONE; + this.#printingAllowed = true; + } + this.pdfDocument = pdfDocument; + if (!pdfDocument) { + return; + } + const pagesCount = pdfDocument.numPages; + const firstPagePromise = pdfDocument.getPage(1); + const optionalContentConfigPromise = pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + const permissionsPromise = this.#enablePermissions ? pdfDocument.getPermissions() : Promise.resolve(); + const { + eventBus, + pageColors, + viewer + } = this; + this.#eventAbortController = new AbortController(); + const { + signal + } = this.#eventAbortController; + if (pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + console.warn("Forcing PAGE-scrolling for performance reasons, given the length of the document."); + const mode = this._scrollMode = ScrollMode.PAGE; + eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + } + this._pagesCapability.promise.then(() => { + eventBus.dispatch("pagesloaded", { + source: this, + pagesCount + }); + }, () => {}); + const onBeforeDraw = evt => { + const pageView = this._pages[evt.pageNumber - 1]; + if (!pageView) { + return; + } + this.#buffer.push(pageView); + }; + eventBus._on("pagerender", onBeforeDraw, { + signal + }); + const onAfterDraw = evt => { + if (evt.cssTransform || evt.isDetailView) { + return; + } + this._onePageRenderedCapability.resolve({ + timestamp: evt.timestamp + }); + eventBus._off("pagerendered", onAfterDraw); + }; + eventBus._on("pagerendered", onAfterDraw, { + signal + }); + Promise.all([firstPagePromise, permissionsPromise]).then(([firstPdfPage, permissions]) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this._firstPageCapability.resolve(firstPdfPage); + this._optionalContentConfigPromise = optionalContentConfigPromise; + const { + annotationEditorMode, + annotationMode, + textLayerMode + } = this.#initializePermissions(permissions); + if (textLayerMode !== TextLayerMode.DISABLE) { + const element = this.#hiddenCopyElement = document.createElement("div"); + element.id = "hiddenCopyElement"; + viewer.before(element); + } + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const mode = annotationEditorMode; + if (pdfDocument.isPureXfa) { + console.warn("Warning: XFA-editing is not implemented."); + } else if (isValidAnnotationEditorMode(mode)) { + this.#annotationEditorUIManager = new AnnotationEditorUIManager(this.container, viewer, this.#viewerAlert, this.#altTextManager, this.#commentManager, this.#signatureManager, eventBus, pdfDocument, pageColors, this.#annotationEditorHighlightColors, this.#enableHighlightFloatingButton, this.#enableUpdatedAddImage, this.#enableNewAltTextWhenAddingImage, this.#mlManager, this.#editorUndoBar, this.#supportsPinchToZoom); + eventBus.dispatch("annotationeditoruimanager", { + source: this, + uiManager: this.#annotationEditorUIManager + }); + if (mode !== AnnotationEditorType.NONE) { + this.#preloadEditingData(mode); + this.#annotationEditorUIManager.updateMode(mode); + } + } else { + console.error(`Invalid AnnotationEditor mode: ${mode}`); + } + } + const viewerElement = this._scrollMode === ScrollMode.PAGE ? null : viewer; + const scale = this.currentScale; + const viewport = firstPdfPage.getViewport({ + scale: scale * PixelsPerInch.PDF_TO_CSS_UNITS + }); + viewer.style.setProperty("--scale-factor", viewport.scale); + if (pageColors?.background) { + viewer.style.setProperty("--page-bg-color", pageColors.background); + } + if (pageColors?.foreground === "CanvasText" || pageColors?.background === "Canvas") { + viewer.style.setProperty("--hcm-highlight-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight", "CanvasText", "Canvas", "HighlightText", "Highlight")); + viewer.style.setProperty("--hcm-highlight-selected-filter", pdfDocument.filterFactory.addHighlightHCMFilter("highlight_selected", "CanvasText", "Canvas", "HighlightText", "ButtonText")); + } + for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) { + const pageView = new PDFPageView({ + container: viewerElement, + eventBus, + id: pageNum, + scale, + defaultViewport: viewport.clone(), + optionalContentConfigPromise, + renderingQueue: this.renderingQueue, + textLayerMode, + annotationMode, + imageResourcesPath: this.imageResourcesPath, + maxCanvasPixels: this.maxCanvasPixels, + maxCanvasDim: this.maxCanvasDim, + capCanvasAreaFactor: this.capCanvasAreaFactor, + enableDetailCanvas: this.enableDetailCanvas, + enableOptimizedPartialRendering: this.enableOptimizedPartialRendering, + pageColors, + l10n: this.l10n, + layerProperties: this._layerProperties, + enableHWA: this.#enableHWA, + enableAutoLinking: this.#enableAutoLinking, + minDurationToUpdateCanvas: this.#minDurationToUpdateCanvas, + commentManager: this.#commentManager + }); + this._pages.push(pageView); + } + this._pages[0]?.setPdfPage(firstPdfPage); + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._spreadMode !== SpreadMode.NONE) { + this._updateSpreadMode(); + } + eventBus._on("annotationeditorlayerrendered", evt => { + if (this.#annotationEditorUIManager) { + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode: this.#annotationEditorMode + }); + } + }, { + once: true, + signal + }); + this.#onePageRenderedOrForceFetch(signal).then(async () => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.findController?.setDocument(pdfDocument); + this._scriptingManager?.setDocument(pdfDocument); + if (this.#hiddenCopyElement) { + document.addEventListener("copy", this.#copyCallback.bind(this, textLayerMode), { + signal + }); + } + if (pdfDocument.loadingParams.disableAutoFetch || pagesCount > PagesCountLimit.FORCE_LAZY_PAGE_INIT) { + this._pagesCapability.resolve(); + return; + } + let getPagesLeft = pagesCount - 1; + if (getPagesLeft <= 0) { + this._pagesCapability.resolve(); + return; + } + for (let pageNum = 2; pageNum <= pagesCount; ++pageNum) { + const promise = pdfDocument.getPage(pageNum).then(pdfPage => { + const pageView = this._pages[pageNum - 1]; + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }, reason => { + console.error(`Unable to get page ${pageNum} to initialize viewer`, reason); + if (--getPagesLeft === 0) { + this._pagesCapability.resolve(); + } + }); + if (pageNum % PagesCountLimit.PAUSE_EAGER_PAGE_INIT === 0) { + await promise; + } + } + }); + eventBus.dispatch("pagesinit", { + source: this + }); + pdfDocument.getMetadata().then(({ + info + }) => { + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.Language) { + viewer.lang = info.Language; + } + }); + if (this.defaultRenderingQueue) { + this.update(); + } + }).catch(reason => { + console.error("Unable to initialize viewer", reason); + this._pagesCapability.reject(reason); + }); + } + setPageLabels(labels) { + if (!this.pdfDocument) { + return; + } + if (!labels) { + this._pageLabels = null; + } else if (!(Array.isArray(labels) && this.pdfDocument.numPages === labels.length)) { + this._pageLabels = null; + console.error(`setPageLabels: Invalid page labels.`); + } else { + this._pageLabels = labels; + } + for (let i = 0, ii = this._pages.length; i < ii; i++) { + this._pages[i].setPageLabel(this._pageLabels?.[i] ?? null); + } + } + _resetView() { + this._pages = []; + this._currentPageNumber = 1; + this._currentScale = UNKNOWN_SCALE; + this._currentScaleValue = null; + this._pageLabels = null; + this.#buffer = new PDFPageViewBuffer(DEFAULT_CACHE_SIZE); + this._location = null; + this._pagesRotation = 0; + this._optionalContentConfigPromise = null; + this._firstPageCapability = Promise.withResolvers(); + this._onePageRenderedCapability = Promise.withResolvers(); + this._pagesCapability = Promise.withResolvers(); + this._scrollMode = ScrollMode.VERTICAL; + this._previousScrollMode = ScrollMode.UNKNOWN; + this._spreadMode = SpreadMode.NONE; + this.#scrollModePageState = { + previousPageNumber: 1, + scrollDown: true, + pages: [] + }; + this.#eventAbortController?.abort(); + this.#eventAbortController = null; + this.viewer.textContent = ""; + this._updateScrollMode(); + this.viewer.removeAttribute("lang"); + this.#hiddenCopyElement?.remove(); + this.#hiddenCopyElement = null; + this.#cleanupTimeouts(); + this.#cleanupSwitchAnnotationEditorMode(); + } + #ensurePageViewVisible() { + if (this._scrollMode !== ScrollMode.PAGE) { + throw new Error("#ensurePageViewVisible: Invalid scrollMode value."); + } + const pageNumber = this._currentPageNumber, + state = this.#scrollModePageState, + viewer = this.viewer; + viewer.textContent = ""; + state.pages.length = 0; + if (this._spreadMode === SpreadMode.NONE && !this.isInPresentationMode) { + const pageView = this._pages[pageNumber - 1]; + viewer.append(pageView.div); + state.pages.push(pageView); + } else { + const pageIndexSet = new Set(), + parity = this._spreadMode - 1; + if (parity === -1) { + pageIndexSet.add(pageNumber - 1); + } else if (pageNumber % 2 !== parity) { + pageIndexSet.add(pageNumber - 1); + pageIndexSet.add(pageNumber); + } else { + pageIndexSet.add(pageNumber - 2); + pageIndexSet.add(pageNumber - 1); + } + const spread = document.createElement("div"); + spread.className = "spread"; + if (this.isInPresentationMode) { + const dummyPage = document.createElement("div"); + dummyPage.className = "dummyPage"; + spread.append(dummyPage); + } + for (const i of pageIndexSet) { + const pageView = this._pages[i]; + if (!pageView) { + continue; + } + spread.append(pageView.div); + state.pages.push(pageView); + } + viewer.append(spread); + } + state.scrollDown = pageNumber >= state.previousPageNumber; + state.previousPageNumber = pageNumber; + } + _scrollUpdate() { + if (this.pagesCount === 0) { + return; + } + if (this.#scrollTimeoutId) { + clearTimeout(this.#scrollTimeoutId); + } + this.#scrollTimeoutId = setTimeout(() => { + this.#scrollTimeoutId = null; + this.update(); + }, 100); + this.update(); + } + #scrollIntoView(pageView, pageSpot = null) { + const { + div, + id + } = pageView; + if (this._currentPageNumber !== id) { + this._setCurrentPageNumber(id); + } + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + this.update(); + } + if (!pageSpot && !this.isInPresentationMode) { + const left = div.offsetLeft + div.clientLeft, + right = left + div.clientWidth; + const { + scrollLeft, + clientWidth + } = this.container; + if (this._scrollMode === ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) { + pageSpot = { + left: 0, + top: 0 + }; + } + } + scrollIntoView(div, pageSpot); + if (!this._currentScaleValue && this._location) { + this._location = null; + } + } + #isSameScale(newScale) { + return newScale === this._currentScale || Math.abs(newScale - this._currentScale) < 1e-15; + } + #setScaleUpdatePages(newScale, newValue, { + noScroll = false, + preset = false, + drawingDelay = -1, + origin = null + }) { + this._currentScaleValue = newValue.toString(); + if (this.#isSameScale(newScale)) { + if (preset) { + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: newValue + }); + } + return; + } + this.viewer.style.setProperty("--scale-factor", newScale * PixelsPerInch.PDF_TO_CSS_UNITS); + const postponeDrawing = drawingDelay >= 0 && drawingDelay < 1000; + this.refresh(true, { + scale: newScale, + drawingDelay: postponeDrawing ? drawingDelay : -1 + }); + if (postponeDrawing) { + this.#scaleTimeoutId = setTimeout(() => { + this.#scaleTimeoutId = null; + this.refresh(); + }, drawingDelay); + } + const previousScale = this._currentScale; + this._currentScale = newScale; + if (!noScroll) { + let page = this._currentPageNumber, + dest; + if (this._location && !(this.isInPresentationMode || this.isChangingPresentationMode)) { + page = this._location.pageNumber; + dest = [null, { + name: "XYZ" + }, this._location.left, this._location.top, null]; + } + this.scrollPageIntoView({ + pageNumber: page, + destArray: dest, + allowNegativeOffset: true + }); + if (Array.isArray(origin)) { + const scaleDiff = newScale / previousScale - 1; + const [top, left] = this.containerTopLeft; + this.container.scrollLeft += (origin[0] - left) * scaleDiff; + this.container.scrollTop += (origin[1] - top) * scaleDiff; + } + } + this.eventBus.dispatch("scalechanging", { + source: this, + scale: newScale, + presetValue: preset ? newValue : undefined + }); + if (this.defaultRenderingQueue) { + this.update(); + } + } + get #pageWidthScaleFactor() { + if (this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL) { + return 2; + } + return 1; + } + #setScale(value, options) { + let scale = parseFloat(value); + if (scale > 0) { + options.preset = false; + this.#setScaleUpdatePages(scale, value, options); + } else { + const currentPage = this._pages[this._currentPageNumber - 1]; + if (!currentPage) { + return; + } + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.isInPresentationMode) { + hPadding = vPadding = 4; + if (this._spreadMode !== SpreadMode.NONE) { + hPadding *= 2; + } + } else if (this.removePageBorders) { + hPadding = vPadding = 0; + } else if (this._scrollMode === ScrollMode.HORIZONTAL) { + [hPadding, vPadding] = [vPadding, hPadding]; + } + const pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale / this.#pageWidthScaleFactor; + const pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale; + switch (value) { + case "page-actual": + scale = 1; + break; + case "page-width": + scale = pageWidthScale; + break; + case "page-height": + scale = pageHeightScale; + break; + case "page-fit": + scale = Math.min(pageWidthScale, pageHeightScale); + break; + case "auto": + const horizontalScale = isPortraitOrientation(currentPage) ? pageWidthScale : Math.min(pageHeightScale, pageWidthScale); + scale = Math.min(MAX_AUTO_SCALE, horizontalScale); + break; + default: + console.error(`#setScale: "${value}" is an unknown zoom value.`); + return; + } + options.preset = true; + this.#setScaleUpdatePages(scale, value, options); + } + } + #resetCurrentPageView() { + const pageView = this._pages[this._currentPageNumber - 1]; + if (this.isInPresentationMode) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this.#scrollIntoView(pageView); + } + pageLabelToPageNumber(label) { + if (!this._pageLabels) { + return null; + } + const i = this._pageLabels.indexOf(label); + if (i < 0) { + return null; + } + return i + 1; + } + scrollPageIntoView({ + pageNumber, + destArray = null, + allowNegativeOffset = false, + ignoreDestinationZoom = false, + center = null + }) { + if (!this.pdfDocument) { + return; + } + const pageView = Number.isInteger(pageNumber) && this._pages[pageNumber - 1]; + if (!pageView) { + console.error(`scrollPageIntoView: "${pageNumber}" is not a valid pageNumber parameter.`); + return; + } + if (this.isInPresentationMode || !destArray) { + this._setCurrentPageNumber(pageNumber, true); + return; + } + let x = 0, + y = 0; + let width = 0, + height = 0, + widthScale, + heightScale; + const changeOrientation = pageView.rotation % 180 !== 0; + const pageWidth = (changeOrientation ? pageView.height : pageView.width) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + const pageHeight = (changeOrientation ? pageView.width : pageView.height) / pageView.scale / PixelsPerInch.PDF_TO_CSS_UNITS; + let scale = 0; + switch (destArray[1].name) { + case "XYZ": + x = destArray[2]; + y = destArray[3]; + scale = destArray[4]; + x = x !== null ? x : 0; + y = y !== null ? y : pageHeight; + break; + case "Fit": + case "FitB": + scale = "page-fit"; + break; + case "FitH": + case "FitBH": + y = destArray[2]; + scale = "page-width"; + if (y === null && this._location) { + x = this._location.left; + y = this._location.top; + } else if (typeof y !== "number" || y < 0) { + y = pageHeight; + } + break; + case "FitV": + case "FitBV": + x = destArray[2]; + width = pageWidth; + height = pageHeight; + scale = "page-height"; + break; + case "FitR": + x = destArray[2]; + y = destArray[3]; + width = destArray[4] - x; + height = destArray[5] - y; + let hPadding = SCROLLBAR_PADDING, + vPadding = VERTICAL_PADDING; + if (this.removePageBorders) { + hPadding = vPadding = 0; + } + widthScale = (this.container.clientWidth - hPadding) / width / PixelsPerInch.PDF_TO_CSS_UNITS; + heightScale = (this.container.clientHeight - vPadding) / height / PixelsPerInch.PDF_TO_CSS_UNITS; + scale = Math.min(Math.abs(widthScale), Math.abs(heightScale)); + break; + default: + console.error(`scrollPageIntoView: "${destArray[1].name}" is not a valid destination type.`); + return; + } + if (!ignoreDestinationZoom) { + if (scale && scale !== this._currentScale) { + this.currentScaleValue = scale; + } else if (this._currentScale === UNKNOWN_SCALE) { + this.currentScaleValue = DEFAULT_SCALE_VALUE; + } + } + if (scale === "page-fit" && !destArray[4]) { + this.#scrollIntoView(pageView); + return; + } + const boundingRect = [pageView.viewport.convertToViewportPoint(x, y), pageView.viewport.convertToViewportPoint(x + width, y + height)]; + let left = Math.min(boundingRect[0][0], boundingRect[1][0]); + let top = Math.min(boundingRect[0][1], boundingRect[1][1]); + if (center) { + if (center === "both" || center === "vertical") { + top -= (this.container.clientHeight - Math.abs(boundingRect[1][1] - boundingRect[0][1])) / 2; + } + if (center === "both" || center === "horizontal") { + left -= (this.container.clientWidth - Math.abs(boundingRect[1][0] - boundingRect[0][0])) / 2; + } + } else if (!allowNegativeOffset) { + left = Math.max(left, 0); + top = Math.max(top, 0); + } + this.#scrollIntoView(pageView, { + left, + top + }); + } + _updateLocation(firstPage) { + const currentScale = this._currentScale; + const currentScaleValue = this._currentScaleValue; + const normalizedScaleValue = parseFloat(currentScaleValue) === currentScale ? Math.round(currentScale * 10000) / 100 : currentScaleValue; + const pageNumber = firstPage.id; + const currentPageView = this._pages[pageNumber - 1]; + const container = this.container; + const topLeft = currentPageView.getPagePoint(container.scrollLeft - firstPage.x, container.scrollTop - firstPage.y); + const intLeft = Math.round(topLeft[0]); + const intTop = Math.round(topLeft[1]); + let pdfOpenParams = `#page=${pageNumber}`; + if (!this.isInPresentationMode) { + pdfOpenParams += `&zoom=${normalizedScaleValue},${intLeft},${intTop}`; + } + this._location = { + pageNumber, + scale: normalizedScaleValue, + top: intTop, + left: intLeft, + rotation: this._pagesRotation, + pdfOpenParams + }; + } + update() { + const visible = this._getVisiblePages(); + const visiblePages = visible.views, + numVisiblePages = visiblePages.length; + if (numVisiblePages === 0) { + return; + } + const newCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1); + this.#buffer.resize(newCacheSize, visible.ids); + for (const { + view, + visibleArea + } of visiblePages) { + view.updateVisibleArea(visibleArea); + } + for (const view of this.#buffer) { + if (!visible.ids.has(view.id)) { + view.updateVisibleArea(null); + } + } + this.renderingQueue.renderHighestPriority(visible); + const isSimpleLayout = this._spreadMode === SpreadMode.NONE && (this._scrollMode === ScrollMode.PAGE || this._scrollMode === ScrollMode.VERTICAL); + const currentId = this._currentPageNumber; + let stillFullyVisible = false; + for (const page of visiblePages) { + if (page.percent < 100) { + break; + } + if (page.id === currentId && isSimpleLayout) { + stillFullyVisible = true; + break; + } + } + this._setCurrentPageNumber(stillFullyVisible ? currentId : visiblePages[0].id); + this._updateLocation(visible.first); + this.eventBus.dispatch("updateviewarea", { + source: this, + location: this._location + }); + } + #switchToEditAnnotationMode() { + const visible = this._getVisiblePages(); + const pagesToRefresh = []; + const { + ids, + views + } = visible; + for (const page of views) { + const { + view + } = page; + if (!view.hasEditableAnnotations()) { + ids.delete(view.id); + continue; + } + pagesToRefresh.push(page); + } + if (pagesToRefresh.length === 0) { + return null; + } + this.renderingQueue.renderHighestPriority({ + first: pagesToRefresh[0], + last: pagesToRefresh.at(-1), + views: pagesToRefresh, + ids + }); + return ids; + } + containsElement(element) { + return this.container.contains(element); + } + focus() { + this.container.focus(); + } + get _isContainerRtl() { + return getComputedStyle(this.container).direction === "rtl"; + } + get isInPresentationMode() { + return this.presentationModeState === PresentationModeState.FULLSCREEN; + } + get isChangingPresentationMode() { + return this.presentationModeState === PresentationModeState.CHANGING; + } + get isHorizontalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth; + } + get isVerticalScrollbarEnabled() { + return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight; + } + _getVisiblePages() { + const views = this._scrollMode === ScrollMode.PAGE ? this.#scrollModePageState.pages : this._pages, + horizontal = this._scrollMode === ScrollMode.HORIZONTAL, + rtl = horizontal && this._isContainerRtl; + return getVisibleElements({ + scrollEl: this.container, + views, + sortByVisibility: true, + horizontal, + rtl + }); + } + cleanup() { + for (const pageView of this._pages) { + if (pageView.renderingState !== RenderingStates.FINISHED) { + pageView.reset(); + } + } + } + _cancelRendering() { + for (const pageView of this._pages) { + pageView.cancelRendering(); + } + } + async #ensurePdfPageLoaded(pageView) { + if (pageView.pdfPage) { + return pageView.pdfPage; + } + try { + const pdfPage = await this.pdfDocument.getPage(pageView.id); + if (!pageView.pdfPage) { + pageView.setPdfPage(pdfPage); + } + return pdfPage; + } catch (reason) { + console.error("Unable to get page for page view", reason); + return null; + } + } + #getScrollAhead(visible) { + if (visible.first?.id === 1) { + return true; + } else if (visible.last?.id === this.pagesCount) { + return false; + } + switch (this._scrollMode) { + case ScrollMode.PAGE: + return this.#scrollModePageState.scrollDown; + case ScrollMode.HORIZONTAL: + return this.scroll.right; + } + return this.scroll.down; + } + forceRendering(currentlyVisiblePages) { + const visiblePages = currentlyVisiblePages || this._getVisiblePages(); + const scrollAhead = this.#getScrollAhead(visiblePages); + const preRenderExtra = this._spreadMode !== SpreadMode.NONE && this._scrollMode !== ScrollMode.HORIZONTAL; + const ignoreDetailViews = this.#scaleTimeoutId !== null || this.#scrollTimeoutId !== null && visiblePages.views.some(page => page.detailView?.renderingCancelled); + const pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead, preRenderExtra, ignoreDetailViews); + if (pageView) { + this.#ensurePdfPageLoaded(pageView).then(() => { + this.renderingQueue.renderView(pageView); + }); + return true; + } + return false; + } + get hasEqualPageSizes() { + const firstPageView = this._pages[0]; + for (let i = 1, ii = this._pages.length; i < ii; ++i) { + const pageView = this._pages[i]; + if (pageView.width !== firstPageView.width || pageView.height !== firstPageView.height) { + return false; + } + } + return true; + } + getPagesOverview() { + let initialOrientation; + return this._pages.map(pageView => { + const viewport = pageView.pdfPage.getViewport({ + scale: 1 + }); + const orientation = isPortraitOrientation(viewport); + if (initialOrientation === undefined) { + initialOrientation = orientation; + } else if (this.enablePrintAutoRotate && orientation !== initialOrientation) { + return { + width: viewport.height, + height: viewport.width, + rotation: (viewport.rotation - 90) % 360 + }; + } + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation + }; + }); + } + get optionalContentConfigPromise() { + if (!this.pdfDocument) { + return Promise.resolve(null); + } + if (!this._optionalContentConfigPromise) { + console.error("optionalContentConfigPromise: Not initialized yet."); + return this.pdfDocument.getOptionalContentConfig({ + intent: "display" + }); + } + return this._optionalContentConfigPromise; + } + set optionalContentConfigPromise(promise) { + if (!(promise instanceof Promise)) { + throw new Error(`Invalid optionalContentConfigPromise: ${promise}`); + } + if (!this.pdfDocument) { + return; + } + if (!this._optionalContentConfigPromise) { + return; + } + this._optionalContentConfigPromise = promise; + this.refresh(false, { + optionalContentConfigPromise: promise + }); + this.eventBus.dispatch("optionalcontentconfigchanged", { + source: this, + promise + }); + } + get scrollMode() { + return this._scrollMode; + } + set scrollMode(mode) { + if (this._scrollMode === mode) { + return; + } + if (!isValidScrollMode(mode)) { + throw new Error(`Invalid scroll mode: ${mode}`); + } + if (this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE) { + return; + } + this._previousScrollMode = this._scrollMode; + this._scrollMode = mode; + this.eventBus.dispatch("scrollmodechanged", { + source: this, + mode + }); + this._updateScrollMode(this._currentPageNumber); + } + _updateScrollMode(pageNumber = null) { + const scrollMode = this._scrollMode, + viewer = this.viewer; + viewer.classList.toggle("scrollHorizontal", scrollMode === ScrollMode.HORIZONTAL); + viewer.classList.toggle("scrollWrapped", scrollMode === ScrollMode.WRAPPED); + if (!this.pdfDocument || !pageNumber) { + return; + } + if (scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else if (this._previousScrollMode === ScrollMode.PAGE) { + this._updateSpreadMode(); + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + get spreadMode() { + return this._spreadMode; + } + set spreadMode(mode) { + if (this._spreadMode === mode) { + return; + } + if (!isValidSpreadMode(mode)) { + throw new Error(`Invalid spread mode: ${mode}`); + } + this._spreadMode = mode; + this.eventBus.dispatch("spreadmodechanged", { + source: this, + mode + }); + this._updateSpreadMode(this._currentPageNumber); + } + _updateSpreadMode(pageNumber = null) { + if (!this.pdfDocument) { + return; + } + const viewer = this.viewer, + pages = this._pages; + if (this._scrollMode === ScrollMode.PAGE) { + this.#ensurePageViewVisible(); + } else { + viewer.textContent = ""; + if (this._spreadMode === SpreadMode.NONE) { + for (const pageView of this._pages) { + viewer.append(pageView.div); + } + } else { + const parity = this._spreadMode - 1; + let spread = null; + for (let i = 0, ii = pages.length; i < ii; ++i) { + if (spread === null) { + spread = document.createElement("div"); + spread.className = "spread"; + viewer.append(spread); + } else if (i % 2 === parity) { + spread = spread.cloneNode(false); + viewer.append(spread); + } + spread.append(pages[i].div); + } + } + } + if (!pageNumber) { + return; + } + if (this._currentScaleValue && isNaN(this._currentScaleValue)) { + this.#setScale(this._currentScaleValue, { + noScroll: true + }); + } + this._setCurrentPageNumber(pageNumber, true); + this.update(); + } + _getPageAdvance(currentPageNumber, previous = false) { + switch (this._scrollMode) { + case ScrollMode.WRAPPED: + { + const { + views + } = this._getVisiblePages(), + pageLayout = new Map(); + for (const { + id, + y, + percent, + widthPercent + } of views) { + if (percent === 0 || widthPercent < 100) { + continue; + } + let yArray = pageLayout.get(y); + if (!yArray) { + pageLayout.set(y, yArray ||= []); + } + yArray.push(id); + } + for (const yArray of pageLayout.values()) { + const currentIndex = yArray.indexOf(currentPageNumber); + if (currentIndex === -1) { + continue; + } + const numPages = yArray.length; + if (numPages === 1) { + break; + } + if (previous) { + for (let i = currentIndex - 1, ii = 0; i >= ii; i--) { + const currentId = yArray[i], + expectedId = yArray[i + 1] - 1; + if (currentId < expectedId) { + return currentPageNumber - expectedId; + } + } + } else { + for (let i = currentIndex + 1, ii = numPages; i < ii; i++) { + const currentId = yArray[i], + expectedId = yArray[i - 1] + 1; + if (currentId > expectedId) { + return expectedId - currentPageNumber; + } + } + } + if (previous) { + const firstId = yArray[0]; + if (firstId < currentPageNumber) { + return currentPageNumber - firstId + 1; + } + } else { + const lastId = yArray[numPages - 1]; + if (lastId > currentPageNumber) { + return lastId - currentPageNumber + 1; + } + } + break; + } + break; + } + case ScrollMode.HORIZONTAL: + { + break; + } + case ScrollMode.PAGE: + case ScrollMode.VERTICAL: + { + if (this._spreadMode === SpreadMode.NONE) { + break; + } + const parity = this._spreadMode - 1; + if (previous && currentPageNumber % 2 !== parity) { + break; + } else if (!previous && currentPageNumber % 2 === parity) { + break; + } + const { + views + } = this._getVisiblePages(), + expectedId = previous ? currentPageNumber - 1 : currentPageNumber + 1; + for (const { + id, + percent, + widthPercent + } of views) { + if (id !== expectedId) { + continue; + } + if (percent > 0 && widthPercent === 100) { + return 2; + } + break; + } + break; + } + } + return 1; + } + nextPage() { + const currentPageNumber = this._currentPageNumber, + pagesCount = this.pagesCount; + if (currentPageNumber >= pagesCount) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, false) || 1; + this.currentPageNumber = Math.min(currentPageNumber + advance, pagesCount); + return true; + } + previousPage() { + const currentPageNumber = this._currentPageNumber; + if (currentPageNumber <= 1) { + return false; + } + const advance = this._getPageAdvance(currentPageNumber, true) || 1; + this.currentPageNumber = Math.max(currentPageNumber - advance, 1); + return true; + } + updateScale({ + drawingDelay, + scaleFactor = null, + steps = null, + origin + }) { + if (steps === null && scaleFactor === null) { + throw new Error("Invalid updateScale options: either `steps` or `scaleFactor` must be provided."); + } + if (!this.pdfDocument) { + return; + } + let newScale = this._currentScale; + if (scaleFactor > 0 && scaleFactor !== 1) { + newScale = Math.round(newScale * scaleFactor * 100) / 100; + } else if (steps) { + const delta = steps > 0 ? DEFAULT_SCALE_DELTA : 1 / DEFAULT_SCALE_DELTA; + const round = steps > 0 ? Math.ceil : Math.floor; + steps = Math.abs(steps); + do { + newScale = round((newScale * delta).toFixed(2) * 10) / 10; + } while (--steps > 0); + } + newScale = MathClamp(newScale, MIN_SCALE, MAX_SCALE); + this.#setScale(newScale, { + noScroll: false, + drawingDelay, + origin + }); + } + increaseScale(options = {}) { + this.updateScale({ + ...options, + steps: options.steps ?? 1 + }); + } + decreaseScale(options = {}) { + this.updateScale({ + ...options, + steps: -(options.steps ?? 1) + }); + } + #updateContainerHeightCss(height = this.container.clientHeight) { + if (height !== this.#previousContainerHeight) { + this.#previousContainerHeight = height; + docStyle.setProperty("--viewer-container-height", `${height}px`); + } + } + #resizeObserverCallback(entries) { + for (const entry of entries) { + if (entry.target === this.container) { + this.#updateContainerHeightCss(Math.floor(entry.borderBoxSize[0].blockSize)); + this.#containerTopLeft = null; + break; + } + } + } + get containerTopLeft() { + return this.#containerTopLeft ||= [this.container.offsetTop, this.container.offsetLeft]; + } + #cleanupTimeouts() { + if (this.#scaleTimeoutId !== null) { + clearTimeout(this.#scaleTimeoutId); + this.#scaleTimeoutId = null; + } + if (this.#scrollTimeoutId !== null) { + clearTimeout(this.#scrollTimeoutId); + this.#scrollTimeoutId = null; + } + } + #cleanupSwitchAnnotationEditorMode() { + this.#switchAnnotationEditorModeAC?.abort(); + this.#switchAnnotationEditorModeAC = null; + if (this.#switchAnnotationEditorModeTimeoutId !== null) { + clearTimeout(this.#switchAnnotationEditorModeTimeoutId); + this.#switchAnnotationEditorModeTimeoutId = null; + } + } + #preloadEditingData(mode) { + switch (mode) { + case AnnotationEditorType.STAMP: + this.#mlManager?.loadModel("altText"); + break; + case AnnotationEditorType.SIGNATURE: + this.#signatureManager?.loadSignatures(); + break; + } + } + get annotationEditorMode() { + return this.#annotationEditorUIManager ? this.#annotationEditorMode : AnnotationEditorType.DISABLE; + } + set annotationEditorMode({ + mode, + editId = null, + isFromKeyboard = false, + mustEnterInEditMode = false, + editComment = false + }) { + if (!this.#annotationEditorUIManager) { + throw new Error(`The AnnotationEditor is not enabled.`); + } + if (this.#annotationEditorMode === mode) { + return; + } + if (!isValidAnnotationEditorMode(mode)) { + throw new Error(`Invalid AnnotationEditor mode: ${mode}`); + } + if (!this.pdfDocument) { + return; + } + this.#preloadEditingData(mode); + const { + eventBus, + pdfDocument + } = this; + const updater = async () => { + this.#cleanupSwitchAnnotationEditorMode(); + this.#annotationEditorMode = mode; + await this.#annotationEditorUIManager.updateMode(mode, editId, isFromKeyboard, mustEnterInEditMode, editComment); + if (mode !== this.#annotationEditorMode || pdfDocument !== this.pdfDocument) { + return; + } + eventBus.dispatch("annotationeditormodechanged", { + source: this, + mode + }); + }; + if (mode === AnnotationEditorType.NONE || this.#annotationEditorMode === AnnotationEditorType.NONE) { + const isEditing = mode !== AnnotationEditorType.NONE; + if (!isEditing) { + this.pdfDocument.annotationStorage.resetModifiedIds(); + } + this.cleanup(); + for (const pageView of this._pages) { + pageView.toggleEditingMode(isEditing); + } + const idsToRefresh = this.#switchToEditAnnotationMode(); + if (isEditing && idsToRefresh) { + this.#cleanupSwitchAnnotationEditorMode(); + this.#switchAnnotationEditorModeAC = new AbortController(); + const signal = AbortSignal.any([this.#eventAbortController.signal, this.#switchAnnotationEditorModeAC.signal]); + eventBus._on("pagerendered", ({ + pageNumber + }) => { + idsToRefresh.delete(pageNumber); + if (idsToRefresh.size === 0) { + this.#switchAnnotationEditorModeTimeoutId = setTimeout(updater, 0); + } + }, { + signal + }); + return; + } + } + updater(); + } + refresh(noUpdate = false, updateArgs = Object.create(null)) { + if (!this.pdfDocument) { + return; + } + for (const pageView of this._pages) { + pageView.update(updateArgs); + } + this.#cleanupTimeouts(); + if (!noUpdate) { + this.update(); + } + } +} + +;// ./web/secondary_toolbar.js + + +class SecondaryToolbar { + #opts; + constructor(options, eventBus) { + this.#opts = options; + const buttons = [{ + element: options.presentationModeButton, + eventName: "presentationmode", + close: true + }, { + element: options.printButton, + eventName: "print", + close: true + }, { + element: options.downloadButton, + eventName: "download", + close: true + }, { + element: options.viewBookmarkButton, + eventName: null, + close: true + }, { + element: options.firstPageButton, + eventName: "firstpage", + close: true + }, { + element: options.lastPageButton, + eventName: "lastpage", + close: true + }, { + element: options.pageRotateCwButton, + eventName: "rotatecw", + close: false + }, { + element: options.pageRotateCcwButton, + eventName: "rotateccw", + close: false + }, { + element: options.cursorSelectToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.SELECT + }, + close: true + }, { + element: options.cursorHandToolButton, + eventName: "switchcursortool", + eventDetails: { + tool: CursorTool.HAND + }, + close: true + }, { + element: options.scrollPageButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.PAGE + }, + close: true + }, { + element: options.scrollVerticalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.VERTICAL + }, + close: true + }, { + element: options.scrollHorizontalButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.HORIZONTAL + }, + close: true + }, { + element: options.scrollWrappedButton, + eventName: "switchscrollmode", + eventDetails: { + mode: ScrollMode.WRAPPED + }, + close: true + }, { + element: options.spreadNoneButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.NONE + }, + close: true + }, { + element: options.spreadOddButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.ODD + }, + close: true + }, { + element: options.spreadEvenButton, + eventName: "switchspreadmode", + eventDetails: { + mode: SpreadMode.EVEN + }, + close: true + }, { + element: options.imageAltTextSettingsButton, + eventName: "imagealttextsettings", + close: true + }, { + element: options.documentPropertiesButton, + eventName: "documentproperties", + close: true + }]; + buttons.push({ + element: options.openFileButton, + eventName: "openfile", + close: true + }); + this.eventBus = eventBus; + this.opened = false; + this.#bindListeners(buttons); + this.reset(); + } + get isOpen() { + return this.opened; + } + setPageNumber(pageNumber) { + this.pageNumber = pageNumber; + this.#updateUIState(); + } + setPagesCount(pagesCount) { + this.pagesCount = pagesCount; + this.#updateUIState(); + } + reset() { + this.pageNumber = 0; + this.pagesCount = 0; + this.#updateUIState(); + this.eventBus.dispatch("switchcursortool", { + source: this, + reset: true + }); + this.#scrollModeChanged({ + mode: ScrollMode.VERTICAL + }); + this.#spreadModeChanged({ + mode: SpreadMode.NONE + }); + } + #updateUIState() { + const { + firstPageButton, + lastPageButton, + pageRotateCwButton, + pageRotateCcwButton + } = this.#opts; + firstPageButton.disabled = this.pageNumber <= 1; + lastPageButton.disabled = this.pageNumber >= this.pagesCount; + pageRotateCwButton.disabled = this.pagesCount === 0; + pageRotateCcwButton.disabled = this.pagesCount === 0; + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + toggleButton + } = this.#opts; + toggleButton.addEventListener("click", this.toggle.bind(this)); + for (const { + element, + eventName, + close, + eventDetails + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails + }); + } + if (close) { + this.close(); + } + eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "buttons", + data: { + id: element.id + } + } + }); + }); + } + eventBus._on("cursortoolchanged", this.#cursorToolChanged.bind(this)); + eventBus._on("scrollmodechanged", this.#scrollModeChanged.bind(this)); + eventBus._on("spreadmodechanged", this.#spreadModeChanged.bind(this)); + } + #cursorToolChanged({ + tool, + disabled + }) { + const { + cursorSelectToolButton, + cursorHandToolButton + } = this.#opts; + toggleCheckedBtn(cursorSelectToolButton, tool === CursorTool.SELECT); + toggleCheckedBtn(cursorHandToolButton, tool === CursorTool.HAND); + cursorSelectToolButton.disabled = disabled; + cursorHandToolButton.disabled = disabled; + } + #scrollModeChanged({ + mode + }) { + const { + scrollPageButton, + scrollVerticalButton, + scrollHorizontalButton, + scrollWrappedButton, + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(scrollPageButton, mode === ScrollMode.PAGE); + toggleCheckedBtn(scrollVerticalButton, mode === ScrollMode.VERTICAL); + toggleCheckedBtn(scrollHorizontalButton, mode === ScrollMode.HORIZONTAL); + toggleCheckedBtn(scrollWrappedButton, mode === ScrollMode.WRAPPED); + const forceScrollModePage = this.pagesCount > PagesCountLimit.FORCE_SCROLL_MODE_PAGE; + scrollPageButton.disabled = forceScrollModePage; + scrollVerticalButton.disabled = forceScrollModePage; + scrollHorizontalButton.disabled = forceScrollModePage; + scrollWrappedButton.disabled = forceScrollModePage; + const isHorizontal = mode === ScrollMode.HORIZONTAL; + spreadNoneButton.disabled = isHorizontal; + spreadOddButton.disabled = isHorizontal; + spreadEvenButton.disabled = isHorizontal; + } + #spreadModeChanged({ + mode + }) { + const { + spreadNoneButton, + spreadOddButton, + spreadEvenButton + } = this.#opts; + toggleCheckedBtn(spreadNoneButton, mode === SpreadMode.NONE); + toggleCheckedBtn(spreadOddButton, mode === SpreadMode.ODD); + toggleCheckedBtn(spreadEvenButton, mode === SpreadMode.EVEN); + } + open() { + if (this.opened) { + return; + } + this.opened = true; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, true, toolbar); + } + close() { + if (!this.opened) { + return; + } + this.opened = false; + const { + toggleButton, + toolbar + } = this.#opts; + toggleExpandedBtn(toggleButton, false, toolbar); + } + toggle() { + if (this.opened) { + this.close(); + } else { + this.open(); + } + } +} + +;// ./web/signature_manager.js + +const DEFAULT_HEIGHT_IN_PAGE = 40; +class SignatureManager { + #addButton; + #tabsToAltText = null; + #clearButton; + #clearDescription; + #currentEditor; + #description; + #dialog; + #drawCurves = null; + #drawPlaceholder; + #drawPath = null; + #drawPathString = ""; + #drawPoints = null; + #drawSVG; + #drawThickness; + #errorBar; + #errorDescription; + #errorTitle; + #extractedSignatureData = null; + #imagePath = null; + #imagePicker; + #imagePickerLink; + #imagePlaceholder; + #imageSVG; + #saveCheckbox; + #saveContainer; + #tabButtons; + #addSignatureToolbarButton; + #loadSignaturesPromise = null; + #typeInput; + #currentTab = null; + #currentTabAC = null; + #hasDescriptionChanged = false; + #eventBus; + #isStorageFull = false; + #l10n; + #overlayManager; + #editDescriptionDialog; + #signatureStorage; + #uiManager = null; + static #l10nDescription = null; + constructor({ + dialog, + panels, + typeButton, + typeInput, + drawButton, + drawPlaceholder, + drawSVG, + drawThickness, + imageButton, + imageSVG, + imagePlaceholder, + imagePicker, + imagePickerLink, + description, + clearButton, + cancelButton, + addButton, + errorCloseButton, + errorBar, + errorTitle, + errorDescription, + saveCheckbox, + saveContainer + }, editSignatureElements, addSignatureToolbarButton, overlayManager, l10n, signatureStorage, eventBus) { + this.#addButton = addButton; + this.#clearButton = clearButton; + this.#clearDescription = description.lastElementChild; + this.#description = description.firstElementChild; + this.#dialog = dialog; + this.#drawSVG = drawSVG; + this.#drawPlaceholder = drawPlaceholder; + this.#drawThickness = drawThickness; + this.#errorBar = errorBar; + this.#errorTitle = errorTitle; + this.#errorDescription = errorDescription; + this.#imageSVG = imageSVG; + this.#imagePlaceholder = imagePlaceholder; + this.#imagePicker = imagePicker; + this.#imagePickerLink = imagePickerLink; + this.#overlayManager = overlayManager; + this.#saveCheckbox = saveCheckbox; + this.#saveContainer = saveContainer; + this.#addSignatureToolbarButton = addSignatureToolbarButton; + this.#typeInput = typeInput; + this.#l10n = l10n; + this.#signatureStorage = signatureStorage; + this.#eventBus = eventBus; + this.#editDescriptionDialog = new EditDescriptionDialog(editSignatureElements, overlayManager); + SignatureManager.#l10nDescription ||= Object.freeze({ + signature: "pdfjs-editor-add-signature-description-default-when-drawing", + errorUploadTitle: "pdfjs-editor-add-signature-image-upload-error-title", + errorUploadDescription: "pdfjs-editor-add-signature-image-upload-error-description", + errorNoDataTitle: "pdfjs-editor-add-signature-image-no-data-error-title", + errorNoDataDescription: "pdfjs-editor-add-signature-image-no-data-error-description" + }); + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + const { + target + } = e; + if (target !== this.#typeInput && target !== this.#description) { + e.preventDefault(); + } + }); + dialog.addEventListener("drop", e => { + stopEvent(e); + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + addButton.addEventListener("click", this.#add.bind(this)); + clearButton.addEventListener("click", () => { + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.clear", + data: { + type: this.#currentTab + } + }); + this.#initTab(null); + }, { + passive: true + }); + this.#description.addEventListener("input", () => { + this.#clearDescription.disabled = this.#description.value === ""; + }, { + passive: true + }); + this.#clearDescription.addEventListener("click", () => { + this.#description.value = ""; + this.#clearDescription.disabled = true; + }, { + passive: true + }); + errorCloseButton.addEventListener("click", () => { + errorBar.hidden = true; + }, { + passive: true + }); + this.#initTabButtons(typeButton, drawButton, imageButton, panels); + imagePicker.accept = SupportedImageMimeTypes.join(","); + eventBus._on("storedsignatureschanged", this.#signaturesChanged.bind(this)); + overlayManager.register(dialog); + } + #initTabButtons(typeButton, drawButton, imageButton, panels) { + const buttons = this.#tabButtons = new Map([["type", typeButton], ["draw", drawButton], ["image", imageButton]]); + const tabCallback = e => { + for (const [name, button] of buttons) { + if (button === e.target) { + button.setAttribute("aria-selected", true); + button.setAttribute("tabindex", 0); + panels.setAttribute("data-selected", name); + this.#initTab(name); + } else { + button.setAttribute("aria-selected", false); + button.setAttribute("tabindex", -1); + } + } + }; + const buttonsArray = Array.from(buttons.values()); + for (let i = 0, ii = buttonsArray.length; i < ii; i++) { + const button = buttonsArray[i]; + button.addEventListener("click", tabCallback, { + passive: true + }); + button.addEventListener("keydown", ({ + key + }) => { + if (key !== "ArrowLeft" && key !== "ArrowRight") { + return; + } + buttonsArray[i + (key === "ArrowLeft" ? -1 : 1)]?.focus(); + }, { + passive: true + }); + } + } + #resetCommon() { + this.#hasDescriptionChanged = false; + this.#description.value = ""; + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = ""; + } + } + #resetTab(name) { + switch (name) { + case "type": + this.#typeInput.value = ""; + break; + case "draw": + this.#drawCurves = null; + this.#drawPoints = null; + this.#drawPathString = ""; + this.#drawPath?.remove(); + this.#drawPath = null; + this.#drawPlaceholder.hidden = false; + this.#drawThickness.value = 1; + break; + case "image": + this.#imagePlaceholder.hidden = false; + this.#imagePath?.remove(); + this.#imagePath = null; + break; + } + } + #initTab(name) { + if (name && this.#currentTab === name) { + return; + } + if (this.#currentTab) { + this.#tabsToAltText.get(this.#currentTab).value = this.#description.value; + } + if (name) { + this.#currentTab = name; + } + this.#errorBar.hidden = true; + const reset = !name; + if (reset) { + this.#resetCommon(); + } else { + this.#description.value = this.#tabsToAltText.get(this.#currentTab).value; + } + this.#clearDescription.disabled = this.#description.value === ""; + this.#currentTabAC?.abort(); + this.#currentTabAC = new AbortController(); + switch (this.#currentTab) { + case "type": + this.#initTypeTab(reset); + break; + case "draw": + this.#initDrawTab(reset); + break; + case "image": + this.#initImageTab(reset); + break; + } + } + #disableButtons(value) { + if (!value || !this.#isStorageFull) { + this.#saveCheckbox.disabled = !value; + } + this.#clearButton.disabled = this.#addButton.disabled = this.#description.disabled = !value; + } + #initTypeTab(reset) { + if (reset) { + this.#resetTab("type"); + } + this.#disableButtons(this.#typeInput.value); + const { + signal + } = this.#currentTabAC; + const options = { + passive: true, + signal + }; + this.#typeInput.addEventListener("input", () => { + const { + value + } = this.#typeInput; + if (!this.#hasDescriptionChanged) { + this.#tabsToAltText.get("type").default = this.#description.value = value; + this.#clearDescription.disabled = value === ""; + } + this.#disableButtons(value); + }, options); + this.#description.addEventListener("input", () => { + this.#hasDescriptionChanged = this.#typeInput.value !== this.#description.value; + }, options); + } + #initDrawTab(reset) { + if (reset) { + this.#resetTab("draw"); + } + this.#disableButtons(this.#drawPath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + let currentPointerId = NaN; + const drawCallback = e => { + const { + pointerId + } = e; + if (!isNaN(currentPointerId) && currentPointerId !== pointerId) { + return; + } + currentPointerId = pointerId; + e.preventDefault(); + this.#drawSVG.setPointerCapture(pointerId); + const { + width: drawWidth, + height: drawHeight + } = this.#drawSVG.getBoundingClientRect(); + let { + offsetX, + offsetY + } = e; + offsetX = Math.round(offsetX); + offsetY = Math.round(offsetY); + if (e.target === this.#drawPlaceholder) { + this.#drawPlaceholder.hidden = true; + } + if (!this.#drawCurves) { + this.#drawCurves = { + width: drawWidth, + height: drawHeight, + thickness: parseInt(this.#drawThickness.value), + curves: [] + }; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#drawPath = svgFactory.createElement("path"); + path.setAttribute("stroke-width", this.#drawThickness.value); + this.#drawSVG.append(path); + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + this.#drawPlaceholder.removeEventListener("pointerdown", drawCallback); + if (this.#description.value === "") { + this.#l10n.get(SignatureManager.#l10nDescription.signature).then(description => { + this.#tabsToAltText.get("draw").default = description; + this.#description.value ||= description; + this.#clearDescription.disabled = this.#description.value === ""; + }); + } + } + this.#drawPoints = [offsetX, offsetY]; + this.#drawCurves.curves.push({ + points: this.#drawPoints + }); + this.#drawPathString += `M ${offsetX} ${offsetY}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + const finishDrawAC = new AbortController(); + const listenerDrawOptions = { + signal: AbortSignal.any([signal, finishDrawAC.signal]) + }; + this.#drawSVG.addEventListener("contextmenu", noContextMenu, listenerDrawOptions); + this.#drawSVG.addEventListener("pointermove", evt => { + evt.preventDefault(); + let { + offsetX: x, + offsetY: y + } = evt; + x = Math.round(x); + y = Math.round(y); + const drawPoints = this.#drawPoints; + if (x < 0 || y < 0 || x > drawWidth || y > drawHeight || x === drawPoints.at(-2) && y === drawPoints.at(-1)) { + return; + } + if (drawPoints.length >= 4) { + const [x1, y1, x2, y2] = drawPoints.slice(-4); + this.#drawPathString += `C${(x1 + 5 * x2) / 6} ${(y1 + 5 * y2) / 6} ${(5 * x2 + x) / 6} ${(5 * y2 + y) / 6} ${(x2 + x) / 2} ${(y2 + y) / 2}`; + } else { + this.#drawPathString += `L${x} ${y}`; + } + drawPoints.push(x, y); + this.#drawPath.setAttribute("d", this.#drawPathString); + }, listenerDrawOptions); + this.#drawSVG.addEventListener("pointerup", evt => { + const { + pointerId: pId + } = evt; + if (!isNaN(currentPointerId) && currentPointerId !== pId) { + return; + } + currentPointerId = NaN; + evt.preventDefault(); + this.#drawSVG.releasePointerCapture(pId); + finishDrawAC.abort(); + if (this.#drawPoints.length === 2) { + this.#drawPathString += `L${this.#drawPoints[0]} ${this.#drawPoints[1]}`; + this.#drawPath.setAttribute("d", this.#drawPathString); + } + }, listenerDrawOptions); + }; + if (this.#drawCurves) { + this.#drawSVG.addEventListener("pointerdown", drawCallback, options); + } else { + this.#drawPlaceholder.addEventListener("pointerdown", drawCallback, options); + } + this.#drawThickness.addEventListener("input", () => { + const { + value: thickness + } = this.#drawThickness; + this.#drawThickness.setAttribute("data-l10n-args", JSON.stringify({ + thickness + })); + if (!this.#drawCurves) { + return; + } + this.#drawPath.setAttribute("stroke-width", thickness); + this.#drawCurves.thickness = thickness; + }, options); + } + #showError(type) { + this.#errorTitle.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Title`]); + this.#errorDescription.setAttribute("data-l10n-id", SignatureManager.#l10nDescription[`error${type}Description`]); + this.#errorBar.hidden = false; + } + #initImageTab(reset) { + if (reset) { + this.#resetTab("image"); + } + this.#disableButtons(this.#imagePath); + const { + signal + } = this.#currentTabAC; + const options = { + signal + }; + const passiveOptions = { + passive: true, + signal + }; + this.#imagePickerLink.addEventListener("keydown", e => { + const { + key + } = e; + if (key === "Enter" || key === " ") { + stopEvent(e); + this.#imagePicker.click(); + } + }, options); + this.#imagePicker.addEventListener("click", () => { + this.#dialog.classList.toggle("waiting", true); + }, passiveOptions); + this.#imagePicker.addEventListener("change", async () => { + const file = this.#imagePicker.files?.[0]; + if (!file || !SupportedImageMimeTypes.includes(file.type)) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); + return; + } + await this.#extractSignature(file); + }, passiveOptions); + this.#imagePicker.addEventListener("cancel", () => { + this.#dialog.classList.toggle("waiting", false); + }, passiveOptions); + this.#imagePlaceholder.addEventListener("dragover", e => { + const { + dataTransfer + } = e; + for (const { + type + } of dataTransfer.items) { + if (!SupportedImageMimeTypes.includes(type)) { + continue; + } + dataTransfer.dropEffect = dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(e); + return; + } + dataTransfer.dropEffect = "none"; + }, options); + this.#imagePlaceholder.addEventListener("drop", e => { + const { + dataTransfer: { + files + } + } = e; + if (!files?.length) { + return; + } + for (const file of files) { + if (SupportedImageMimeTypes.includes(file.type)) { + this.#extractSignature(file); + break; + } + } + stopEvent(e); + this.#dialog.classList.toggle("waiting", true); + }, options); + } + async #extractSignature(file) { + let data; + try { + data = await this.#uiManager.imageManager.getFromFile(file); + } catch (e) { + console.error("SignatureManager.#extractSignature.", e); + } + if (!data) { + this.#showError("Upload"); + this.#dialog.classList.toggle("waiting", false); + return; + } + const lineData = this.#extractedSignatureData = this.#currentEditor.getFromImage(data.bitmap); + if (!lineData) { + this.#showError("NoData"); + this.#dialog.classList.toggle("waiting", false); + return; + } + const { + outline + } = lineData; + this.#imagePlaceholder.hidden = true; + this.#disableButtons(true); + const svgFactory = new DOMSVGFactory(); + const path = this.#imagePath = svgFactory.createElement("path"); + this.#imageSVG.setAttribute("viewBox", outline.viewBox); + this.#imageSVG.setAttribute("preserveAspectRatio", "xMidYMid meet"); + this.#imageSVG.append(path); + path.setAttribute("d", outline.toSVGPath()); + this.#tabsToAltText.get("image").default = file.name; + if (this.#description.value === "") { + this.#description.value = file.name || ""; + this.#clearDescription.disabled = this.#description.value === ""; + } + this.#dialog.classList.toggle("waiting", false); + } + #getOutlineForType() { + return this.#currentEditor.getFromText(this.#typeInput.value, window.getComputedStyle(this.#typeInput)); + } + #getOutlineForDraw() { + const { + width, + height + } = this.#drawSVG.getBoundingClientRect(); + return this.#currentEditor.getDrawnSignature(this.#drawCurves, width, height); + } + #reportTelemetry(data) { + this.#eventBus.dispatch("reporttelemetry", { + source: this, + details: { + type: "editing", + data + } + }); + } + #addToolbarButton(signatureData, uuid, description) { + const { + curves, + areContours, + thickness, + width, + height + } = signatureData; + const maxDim = Math.max(width, height); + const outlineData = SignatureExtractor.processDrawnLines({ + lines: { + curves, + thickness, + width, + height + }, + pageWidth: maxDim, + pageHeight: maxDim, + rotation: 0, + innerMargin: 0, + mustSmooth: false, + areContours + }); + if (!outlineData) { + return; + } + const { + outline + } = outlineData; + const svgFactory = new DOMSVGFactory(); + const div = document.createElement("div"); + const button = document.createElement("button"); + button.addEventListener("click", () => { + this.#eventBus.dispatch("switchannotationeditorparams", { + source: this, + type: AnnotationEditorParamsType.CREATE, + value: { + signatureData: { + lines: { + curves, + thickness, + width, + height + }, + mustSmooth: false, + areContours, + description, + uuid, + heightInPage: DEFAULT_HEIGHT_IN_PAGE + } + } + }); + }); + div.append(button); + div.classList.add("toolbarAddSignatureButtonContainer"); + const svg = svgFactory.create(1, 1, true); + button.append(svg); + const span = document.createElement("span"); + span.ariaHidden = true; + button.append(span); + button.classList.add("toolbarAddSignatureButton"); + button.type = "button"; + span.textContent = description; + button.setAttribute("data-l10n-id", "pdfjs-editor-add-saved-signature-button"); + button.setAttribute("data-l10n-args", JSON.stringify({ + description + })); + button.tabIndex = 0; + const path = svgFactory.createElement("path"); + svg.append(path); + svg.setAttribute("viewBox", outline.viewBox); + svg.setAttribute("preserveAspectRatio", "xMidYMid meet"); + if (areContours) { + path.classList.add("contours"); + } + path.setAttribute("d", outline.toSVGPath()); + const deleteButton = document.createElement("button"); + div.append(deleteButton); + deleteButton.classList.add("toolbarButton", "deleteButton"); + deleteButton.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button1"); + deleteButton.type = "button"; + deleteButton.tabIndex = 0; + deleteButton.addEventListener("click", async () => { + if (await this.#signatureStorage.delete(uuid)) { + div.remove(); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.delete_saved", + data: { + savedCount: await this.#signatureStorage.size() + } + }); + } + }); + const deleteSpan = document.createElement("span"); + deleteButton.append(deleteSpan); + deleteSpan.setAttribute("data-l10n-id", "pdfjs-editor-delete-signature-button-label1"); + this.#addSignatureToolbarButton.before(div); + } + async #signaturesChanged() { + const parent = this.#addSignatureToolbarButton.parentElement; + while (parent.firstElementChild !== this.#addSignatureToolbarButton) { + parent.firstElementChild.remove(); + } + this.#loadSignaturesPromise = null; + await this.loadSignatures(true); + } + getSignature(params) { + return this.open(params); + } + async loadSignatures(reload = false) { + if (!this.#addSignatureToolbarButton || !reload && this.#addSignatureToolbarButton.previousElementSibling || !this.#signatureStorage) { + return; + } + if (!this.#loadSignaturesPromise) { + this.#loadSignaturesPromise = this.#signatureStorage.getAll().then(async signatures => [signatures, await Promise.all(Array.from(signatures.values(), ({ + signatureData + }) => SignatureExtractor.decompressSignature(signatureData)))]); + if (!reload) { + return; + } + } + const [signatures, signaturesData] = await this.#loadSignaturesPromise; + this.#loadSignaturesPromise = null; + let i = 0; + for (const [uuid, { + description + }] of signatures) { + const data = signaturesData[i++]; + if (!data) { + continue; + } + data.curves = data.outlines.map(points => ({ + points + })); + delete data.outlines; + this.#addToolbarButton(data, uuid, description); + } + } + async renderEditButton(editor) { + const button = document.createElement("button"); + button.classList.add("altText", "editDescription"); + button.tabIndex = 0; + if (editor.description) { + button.title = editor.description; + } + const span = document.createElement("span"); + button.append(span); + span.setAttribute("data-l10n-id", "pdfjs-editor-add-signature-edit-button-label"); + button.addEventListener("click", () => { + this.#editDescriptionDialog.open(editor); + }, { + passive: true + }); + return button; + } + async open({ + uiManager, + editor + }) { + this.#tabsToAltText ||= new Map(this.#tabButtons.keys().map(name => [name, { + value: "", + default: "" + }])); + this.#uiManager = uiManager; + this.#currentEditor = editor; + this.#uiManager.removeEditListeners(); + const isStorageFull = this.#isStorageFull = await this.#signatureStorage.isFull(); + this.#saveContainer.classList.toggle("fullStorage", isStorageFull); + this.#saveCheckbox.checked = !isStorageFull; + await this.#overlayManager.open(this.#dialog); + const tabType = this.#tabButtons.get("type"); + tabType.focus(); + tabType.click(); + } + #cancel() { + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + if (this.#currentEditor._drawId === null) { + this.#currentEditor.remove(); + } + this.#uiManager?.addEditListeners(); + this.#currentTabAC?.abort(); + this.#currentTabAC = null; + this.#uiManager = null; + this.#currentEditor = null; + this.#resetCommon(); + for (const [name] of this.#tabButtons) { + this.#resetTab(name); + } + this.#disableButtons(false); + this.#currentTab = null; + this.#tabsToAltText = null; + } + async #add() { + let data; + const type = this.#currentTab; + switch (type) { + case "type": + data = this.#getOutlineForType(); + break; + case "draw": + data = this.#getOutlineForDraw(); + break; + case "image": + data = this.#extractedSignatureData; + break; + } + let uuid = null; + const description = this.#description.value; + if (this.#saveCheckbox.checked) { + const { + newCurves, + areContours, + thickness, + width, + height + } = data; + const signatureData = await SignatureExtractor.compressSignature({ + outlines: newCurves, + areContours, + thickness, + width, + height + }); + uuid = await this.#signatureStorage.create({ + description, + signatureData + }); + if (uuid) { + this.#addToolbarButton({ + curves: newCurves.map(points => ({ + points + })), + areContours, + thickness, + width, + height + }, uuid, description); + } else { + console.warn("SignatureManager.add: cannot save the signature."); + } + } + const altText = this.#tabsToAltText.get(type); + this.#reportTelemetry({ + type: "signature", + action: "pdfjs.signature.created", + data: { + type, + saved: !!uuid, + savedCount: await this.#signatureStorage.size(), + descriptionChanged: description !== altText.default + } + }); + this.#currentEditor.addSignature(data, DEFAULT_HEIGHT_IN_PAGE, this.#description.value, uuid); + this.#finish(); + } + destroy() { + this.#uiManager = null; + this.#finish(); + } +} +class EditDescriptionDialog { + #currentEditor; + #previousDescription; + #description; + #dialog; + #overlayManager; + #signatureSVG; + #uiManager; + constructor({ + dialog, + description, + cancelButton, + updateButton, + editSignatureView + }, overlayManager) { + const descriptionInput = this.#description = description.firstElementChild; + this.#signatureSVG = editSignatureView; + this.#dialog = dialog; + this.#overlayManager = overlayManager; + dialog.addEventListener("close", this.#close.bind(this)); + dialog.addEventListener("contextmenu", e => { + if (e.target !== this.#description) { + e.preventDefault(); + } + }); + cancelButton.addEventListener("click", this.#cancel.bind(this)); + updateButton.addEventListener("click", this.#update.bind(this)); + const clearDescription = description.lastElementChild; + clearDescription.addEventListener("click", () => { + descriptionInput.value = ""; + clearDescription.disabled = true; + updateButton.disabled = this.#previousDescription === ""; + }); + descriptionInput.addEventListener("input", () => { + const { + value + } = descriptionInput; + clearDescription.disabled = value === ""; + updateButton.disabled = value === this.#previousDescription; + editSignatureView.setAttribute("aria-label", value); + }, { + passive: true + }); + overlayManager.register(dialog); + } + async open(editor) { + this.#uiManager = editor._uiManager; + this.#currentEditor = editor; + this.#previousDescription = this.#description.value = editor.description; + this.#description.dispatchEvent(new Event("input")); + this.#uiManager.removeEditListeners(); + const { + areContours, + outline + } = editor.getSignaturePreview(); + const svgFactory = new DOMSVGFactory(); + const path = svgFactory.createElement("path"); + this.#signatureSVG.append(path); + this.#signatureSVG.setAttribute("viewBox", outline.viewBox); + path.setAttribute("d", outline.toSVGPath()); + if (areContours) { + path.classList.add("contours"); + } + await this.#overlayManager.open(this.#dialog); + } + async #update() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: true + } + }); + this.#currentEditor.description = this.#description.value; + this.#finish(); + } + #cancel() { + this.#currentEditor._reportTelemetry({ + action: "pdfjs.signature.edit_description", + data: { + hasBeenChanged: false + } + }); + this.#finish(); + } + #finish() { + this.#overlayManager.closeIfActive(this.#dialog); + } + #close() { + this.#uiManager?.addEditListeners(); + this.#uiManager = null; + this.#currentEditor = null; + this.#signatureSVG.firstElementChild.remove(); + } +} + +;// ./web/toolbar.js + + +class Toolbar { + #colorPicker = null; + #opts; + constructor(options, eventBus, toolbarDensity = 0) { + this.#opts = options; + this.eventBus = eventBus; + const buttons = [{ + element: options.previous, + eventName: "previouspage" + }, { + element: options.next, + eventName: "nextpage" + }, { + element: options.zoomIn, + eventName: "zoomin" + }, { + element: options.zoomOut, + eventName: "zoomout" + }, { + element: options.print, + eventName: "print" + }, { + element: options.download, + eventName: "download" + }, { + element: options.editorCommentButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorCommentButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.POPUP; + } + } + }, { + element: options.editorFreeTextButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorFreeTextButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.FREETEXT; + } + } + }, { + element: options.editorHighlightButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorHighlightButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.HIGHLIGHT; + } + } + }, { + element: options.editorInkButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorInkButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.INK; + } + } + }, { + element: options.editorStampButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorStampButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.STAMP; + } + }, + telemetry: { + type: "editing", + data: { + action: "pdfjs.image.icon_click" + } + } + }, { + element: options.editorSignatureButton, + eventName: "switchannotationeditormode", + eventDetails: { + get mode() { + const { + classList + } = options.editorSignatureButton; + return classList.contains("toggled") ? AnnotationEditorType.NONE : AnnotationEditorType.SIGNATURE; + } + } + }]; + this.#bindListeners(buttons); + this.#updateToolbarDensity({ + value: toolbarDensity + }); + this.reset(); + } + #updateToolbarDensity({ + value + }) { + let name = "normal"; + switch (value) { + case 1: + name = "compact"; + break; + case 2: + name = "touch"; + break; + } + document.documentElement.setAttribute("data-toolbar-density", name); + } + setPageNumber(pageNumber, pageLabel) { + this.pageNumber = pageNumber; + this.pageLabel = pageLabel; + this.#updateUIState(false); + } + setPagesCount(pagesCount, hasPageLabels) { + this.pagesCount = pagesCount; + this.hasPageLabels = hasPageLabels; + this.#updateUIState(true); + } + setPageScale(pageScaleValue, pageScale) { + this.pageScaleValue = (pageScaleValue || pageScale).toString(); + this.pageScale = pageScale; + this.#updateUIState(false); + } + reset() { + this.#colorPicker = null; + this.pageNumber = 0; + this.pageLabel = null; + this.hasPageLabels = false; + this.pagesCount = 0; + this.pageScaleValue = DEFAULT_SCALE_VALUE; + this.pageScale = DEFAULT_SCALE; + this.#updateUIState(true); + this.updateLoadingIndicatorState(); + this.#editorModeChanged({ + mode: AnnotationEditorType.DISABLE + }); + } + #bindListeners(buttons) { + const { + eventBus + } = this; + const { + editorHighlightColorPicker, + editorHighlightButton, + pageNumber, + scaleSelect + } = this.#opts; + const self = this; + for (const { + element, + eventName, + eventDetails, + telemetry + } of buttons) { + element.addEventListener("click", evt => { + if (eventName !== null) { + eventBus.dispatch(eventName, { + source: this, + ...eventDetails, + isFromKeyboard: evt.detail === 0 + }); + } + if (telemetry) { + eventBus.dispatch("reporttelemetry", { + source: this, + details: telemetry + }); + } + }); + } + pageNumber.addEventListener("click", function () { + this.select(); + }); + pageNumber.addEventListener("change", function () { + eventBus.dispatch("pagenumberchanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("change", function () { + if (this.value === "custom") { + return; + } + eventBus.dispatch("scalechanged", { + source: self, + value: this.value + }); + }); + scaleSelect.addEventListener("click", function ({ + target + }) { + if (this.value === self.pageScaleValue && target.tagName.toUpperCase() === "OPTION") { + this.blur(); + } + }); + scaleSelect.oncontextmenu = noContextMenu; + eventBus._on("annotationeditormodechanged", this.#editorModeChanged.bind(this)); + eventBus._on("showannotationeditorui", ({ + mode + }) => { + switch (mode) { + case AnnotationEditorType.HIGHLIGHT: + editorHighlightButton.click(); + break; + } + }); + eventBus._on("toolbardensity", this.#updateToolbarDensity.bind(this)); + if (editorHighlightColorPicker) { + eventBus._on("annotationeditoruimanager", ({ + uiManager + }) => { + const cp = this.#colorPicker = new ColorPicker({ + uiManager + }); + uiManager.setMainHighlightColorPicker(cp); + editorHighlightColorPicker.append(cp.renderMainDropdown()); + }); + eventBus._on("mainhighlightcolorpickerupdatecolor", ({ + value + }) => { + this.#colorPicker?.updateColor(value); + }); + } + } + #editorModeChanged({ + mode + }) { + const { + editorCommentButton, + editorCommentParamsToolbar, + editorFreeTextButton, + editorFreeTextParamsToolbar, + editorHighlightButton, + editorHighlightParamsToolbar, + editorInkButton, + editorInkParamsToolbar, + editorStampButton, + editorStampParamsToolbar, + editorSignatureButton, + editorSignatureParamsToolbar + } = this.#opts; + toggleExpandedBtn(editorCommentButton, mode === AnnotationEditorType.POPUP, editorCommentParamsToolbar); + toggleExpandedBtn(editorFreeTextButton, mode === AnnotationEditorType.FREETEXT, editorFreeTextParamsToolbar); + toggleExpandedBtn(editorHighlightButton, mode === AnnotationEditorType.HIGHLIGHT, editorHighlightParamsToolbar); + toggleExpandedBtn(editorInkButton, mode === AnnotationEditorType.INK, editorInkParamsToolbar); + toggleExpandedBtn(editorStampButton, mode === AnnotationEditorType.STAMP, editorStampParamsToolbar); + toggleExpandedBtn(editorSignatureButton, mode === AnnotationEditorType.SIGNATURE, editorSignatureParamsToolbar); + editorCommentButton.disabled = editorFreeTextButton.disabled = editorHighlightButton.disabled = editorInkButton.disabled = editorStampButton.disabled = editorSignatureButton.disabled = mode === AnnotationEditorType.DISABLE; + } + #updateUIState(resetNumPages = false) { + const { + pageNumber, + pagesCount, + pageScaleValue, + pageScale + } = this; + const opts = this.#opts; + if (resetNumPages) { + if (this.hasPageLabels) { + opts.pageNumber.type = "text"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-page-of-pages"); + } else { + opts.pageNumber.type = "number"; + opts.numPages.setAttribute("data-l10n-id", "pdfjs-of-pages"); + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pagesCount + })); + } + opts.pageNumber.max = pagesCount; + } + if (this.hasPageLabels) { + opts.pageNumber.value = this.pageLabel; + opts.numPages.setAttribute("data-l10n-args", JSON.stringify({ + pageNumber, + pagesCount + })); + } else { + opts.pageNumber.value = pageNumber; + } + opts.previous.disabled = pageNumber <= 1; + opts.next.disabled = pageNumber >= pagesCount; + opts.zoomOut.disabled = pageScale <= MIN_SCALE; + opts.zoomIn.disabled = pageScale >= MAX_SCALE; + let predefinedValueFound = false; + for (const option of opts.scaleSelect.options) { + if (option.value !== pageScaleValue) { + option.selected = false; + continue; + } + option.selected = true; + predefinedValueFound = true; + } + if (!predefinedValueFound) { + opts.customScaleOption.selected = true; + opts.customScaleOption.setAttribute("data-l10n-args", JSON.stringify({ + scale: Math.round(pageScale * 10000) / 100 + })); + } + } + updateLoadingIndicatorState(loading = false) { + const { + pageNumber + } = this.#opts; + pageNumber.classList.toggle("loading", loading); + } +} + +;// ./web/view_history.js +const DEFAULT_VIEW_HISTORY_CACHE_SIZE = 20; +class ViewHistory { + constructor(fingerprint, cacheSize = DEFAULT_VIEW_HISTORY_CACHE_SIZE) { + this.fingerprint = fingerprint; + this.cacheSize = cacheSize; + this._initializedPromise = this._readFromStorage().then(databaseStr => { + const database = JSON.parse(databaseStr || "{}"); + let index = -1; + if (!Array.isArray(database.files)) { + database.files = []; + } else { + while (database.files.length >= this.cacheSize) { + database.files.shift(); + } + for (let i = 0, ii = database.files.length; i < ii; i++) { + const branch = database.files[i]; + if (branch.fingerprint === this.fingerprint) { + index = i; + break; + } + } + } + if (index === -1) { + index = database.files.push({ + fingerprint: this.fingerprint + }) - 1; + } + this.file = database.files[index]; + this.database = database; + }); + } + async _writeToStorage() { + const databaseStr = JSON.stringify(this.database); + localStorage.setItem("pdfjs.history", databaseStr); + } + async _readFromStorage() { + return localStorage.getItem("pdfjs.history"); + } + async set(name, val) { + await this._initializedPromise; + this.file[name] = val; + return this._writeToStorage(); + } + async setMultiple(properties) { + await this._initializedPromise; + for (const name in properties) { + this.file[name] = properties[name]; + } + return this._writeToStorage(); + } + async get(name, defaultValue) { + await this._initializedPromise; + const val = this.file[name]; + return val !== undefined ? val : defaultValue; + } + async getMultiple(properties) { + await this._initializedPromise; + const values = Object.create(null); + for (const name in properties) { + const val = this.file[name]; + values[name] = val !== undefined ? val : properties[name]; + } + return values; + } +} + +;// ./web/app.js + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +const FORCE_PAGES_LOADED_TIMEOUT = 10000; +const ViewOnLoad = { + UNKNOWN: -1, + PREVIOUS: 0, + INITIAL: 1 +}; +const PDFViewerApplication = { + initialBookmark: document.location.hash.substring(1), + _initializedCapability: { + ...Promise.withResolvers(), + settled: false + }, + appConfig: null, + pdfDocument: null, + pdfLoadingTask: null, + printService: null, + pdfViewer: null, + pdfThumbnailViewer: null, + pdfRenderingQueue: null, + pdfPresentationMode: null, + pdfDocumentProperties: null, + pdfLinkService: null, + pdfHistory: null, + pdfSidebar: null, + pdfOutlineViewer: null, + pdfAttachmentViewer: null, + pdfLayerViewer: null, + pdfCursorTools: null, + pdfScriptingManager: null, + store: null, + downloadManager: null, + overlayManager: null, + preferences: new Preferences(), + toolbar: null, + secondaryToolbar: null, + eventBus: null, + l10n: null, + annotationEditorParams: null, + imageAltTextSettings: null, + isInitialViewSet: false, + isViewerEmbedded: window.parent !== window, + url: "", + baseUrl: "", + mlManager: null, + _downloadUrl: "", + _eventBusAbortController: null, + _windowAbortController: null, + _globalAbortController: new AbortController(), + documentInfo: null, + metadata: null, + _contentDispositionFilename: null, + _contentLength: null, + _saveInProgress: false, + _wheelUnusedTicks: 0, + _wheelUnusedFactor: 1, + _touchManager: null, + _touchUnusedTicks: 0, + _touchUnusedFactor: 1, + _PDFBug: null, + _hasAnnotationEditors: false, + _title: document.title, + _printAnnotationStoragePromise: null, + _isCtrlKeyDown: false, + _caretBrowsing: null, + _isScrolling: false, + editorUndoBar: null, + _printPermissionPromise: null, + async initialize(appConfig) { + this.appConfig = appConfig; + try { + await this.preferences.initializedPromise; + } catch (ex) { + console.error("initialize:", ex); + } + if (AppOptions.get("pdfBugEnabled")) { + await this._parseHashParams(); + } + let mode; + switch (AppOptions.get("viewerCssTheme")) { + case 1: + mode = "light"; + break; + case 2: + mode = "dark"; + break; + } + if (mode) { + docStyle.setProperty("color-scheme", mode); + } + this.l10n = await this.externalServices.createL10n(); + document.getElementsByTagName("html")[0].dir = this.l10n.getDirection(); + this.l10n.translate(appConfig.appContainer || document.documentElement); + if (this.isViewerEmbedded && AppOptions.get("externalLinkTarget") === LinkTarget.NONE) { + AppOptions.set("externalLinkTarget", LinkTarget.TOP); + } + await this._initializeViewerComponents(); + this.bindEvents(); + this.bindWindowEvents(); + this._initializedCapability.settled = true; + this._initializedCapability.resolve(); + }, + async _parseHashParams() { + const hash = document.location.hash.substring(1); + if (!hash) { + return; + } + const { + mainContainer, + viewerContainer + } = this.appConfig, + params = parseQueryString(hash); + const loadPDFBug = async () => { + if (this._PDFBug) { + return; + } + const { + PDFBug + } = await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + AppOptions.get("debuggerSrc")); + this._PDFBug = PDFBug; + }; + if (params.get("disableworker") === "true") { + try { + GlobalWorkerOptions.workerSrc ||= AppOptions.get("workerSrc"); + await import( + /*webpackIgnore: true*/ + /*@vite-ignore*/ + PDFWorker.workerSrc); + AppOptions.set("workerPort", null); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + } + if (params.has("textlayer")) { + switch (params.get("textlayer")) { + case "off": + AppOptions.set("textLayerMode", TextLayerMode.DISABLE); + break; + case "visible": + case "shadow": + case "hover": + viewerContainer.classList.add(`textLayer-${params.get("textlayer")}`); + try { + await loadPDFBug(); + this._PDFBug.loadCSS(); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + break; + } + } + if (params.has("pdfbug")) { + const enabled = params.get("pdfbug").split(","); + try { + await loadPDFBug(); + this._PDFBug.init(mainContainer, enabled); + } catch (ex) { + console.error("_parseHashParams:", ex); + } + const debugOpts = { + pdfBug: true, + fontExtraProperties: true + }; + if (globalThis.StepperManager?.enabled) { + debugOpts.minDurationToUpdateCanvas = 0; + } + AppOptions.setAll(debugOpts); + } + if (params.has("locale")) { + AppOptions.set("localeProperties", { + lang: params.get("locale") + }); + } + const opts = { + disableAutoFetch: x => x === "true", + disableFontFace: x => x === "true", + disableHistory: x => x === "true", + disableRange: x => x === "true", + disableStream: x => x === "true", + verbosity: x => x | 0 + }; + for (const name in opts) { + const check = opts[name], + key = name.toLowerCase(); + if (params.has(key)) { + AppOptions.set(name, check(params.get(key))); + } + } + }, + async _initializeViewerComponents() { + const { + appConfig, + externalServices, + l10n, + mlManager + } = this; + const abortSignal = this._globalAbortController.signal; + const eventBus = new EventBus(); + this.eventBus = AppOptions.eventBus = eventBus; + mlManager?.setEventBus(eventBus, abortSignal); + const overlayManager = this.overlayManager = new OverlayManager(); + const renderingQueue = this.pdfRenderingQueue = new PDFRenderingQueue(); + renderingQueue.onIdle = this._cleanup.bind(this); + const linkService = this.pdfLinkService = new PDFLinkService({ + eventBus, + externalLinkTarget: AppOptions.get("externalLinkTarget"), + externalLinkRel: AppOptions.get("externalLinkRel"), + ignoreDestinationZoom: AppOptions.get("ignoreDestinationZoom") + }); + const downloadManager = this.downloadManager = new DownloadManager(); + const findController = this.findController = new PDFFindController({ + linkService, + eventBus, + updateMatchesCountOnProgress: true + }); + const pdfScriptingManager = this.pdfScriptingManager = new PDFScriptingManager({ + eventBus, + externalServices, + docProperties: this._scriptingDocProperties.bind(this) + }); + const container = appConfig.mainContainer, + viewer = appConfig.viewerContainer; + const annotationEditorMode = AppOptions.get("annotationEditorMode"); + const hasForcedColors = AppOptions.get("forcePageColors") || window.matchMedia("(forced-colors: active)").matches; + const pageColors = hasForcedColors ? { + background: AppOptions.get("pageColorsBackground"), + foreground: AppOptions.get("pageColorsForeground") + } : null; + let altTextManager; + if (AppOptions.get("enableUpdatedAddImage")) { + altTextManager = appConfig.newAltTextDialog ? new NewAltTextManager(appConfig.newAltTextDialog, overlayManager, eventBus) : null; + } else { + altTextManager = appConfig.altTextDialog ? new AltTextManager(appConfig.altTextDialog, container, overlayManager, eventBus) : null; + } + if (appConfig.editorUndoBar) { + this.editorUndoBar = new EditorUndoBar(appConfig.editorUndoBar, eventBus); + } + const signatureManager = AppOptions.get("enableSignatureEditor") && appConfig.addSignatureDialog ? new SignatureManager(appConfig.addSignatureDialog, appConfig.editSignatureDialog, appConfig.annotationEditorParams?.editorSignatureAddSignature || null, overlayManager, l10n, externalServices.createSignatureStorage(eventBus, abortSignal), eventBus) : null; + const ltr = appConfig.viewerContainer ? getComputedStyle(appConfig.viewerContainer).direction === "ltr" : true; + const commentManager = AppOptions.get("enableComment") && appConfig.editCommentDialog ? new CommentManager(appConfig.editCommentDialog, { + learnMoreUrl: AppOptions.get("commentLearnMoreUrl"), + sidebar: appConfig.annotationEditorParams?.editorCommentsSidebar || null, + sidebarResizer: appConfig.annotationEditorParams?.editorCommentsSidebarResizer || null, + commentsList: appConfig.annotationEditorParams?.editorCommentsSidebarList || null, + commentCount: appConfig.annotationEditorParams?.editorCommentsSidebarCount || null, + sidebarTitle: appConfig.annotationEditorParams?.editorCommentsSidebarTitle || null, + closeButton: appConfig.annotationEditorParams?.editorCommentsSidebarCloseButton || null, + commentToolbarButton: appConfig.toolbar?.editorCommentButton || null + }, eventBus, linkService, overlayManager, ltr, hasForcedColors) : null; + const enableHWA = AppOptions.get("enableHWA"), + maxCanvasPixels = AppOptions.get("maxCanvasPixels"), + maxCanvasDim = AppOptions.get("maxCanvasDim"), + capCanvasAreaFactor = AppOptions.get("capCanvasAreaFactor"); + const pdfViewer = this.pdfViewer = new PDFViewer({ + container, + viewer, + viewerAlert: appConfig.viewerAlert, + eventBus, + renderingQueue, + linkService, + downloadManager, + altTextManager, + commentManager, + signatureManager, + editorUndoBar: this.editorUndoBar, + findController, + scriptingManager: AppOptions.get("enableScripting") && pdfScriptingManager, + l10n, + textLayerMode: AppOptions.get("textLayerMode"), + annotationMode: AppOptions.get("annotationMode"), + annotationEditorMode, + annotationEditorHighlightColors: AppOptions.get("highlightEditorColors"), + enableHighlightFloatingButton: AppOptions.get("enableHighlightFloatingButton"), + enableUpdatedAddImage: AppOptions.get("enableUpdatedAddImage"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage"), + imageResourcesPath: AppOptions.get("imageResourcesPath"), + enablePrintAutoRotate: AppOptions.get("enablePrintAutoRotate"), + maxCanvasPixels, + maxCanvasDim, + capCanvasAreaFactor, + enableDetailCanvas: AppOptions.get("enableDetailCanvas"), + enablePermissions: AppOptions.get("enablePermissions"), + enableOptimizedPartialRendering: AppOptions.get("enableOptimizedPartialRendering"), + pageColors, + mlManager, + abortSignal, + enableHWA, + supportsPinchToZoom: this.supportsPinchToZoom, + enableAutoLinking: AppOptions.get("enableAutoLinking"), + minDurationToUpdateCanvas: AppOptions.get("minDurationToUpdateCanvas") + }); + renderingQueue.setViewer(pdfViewer); + linkService.setViewer(pdfViewer); + pdfScriptingManager.setViewer(pdfViewer); + if (appConfig.sidebar?.thumbnailView) { + this.pdfThumbnailViewer = new PDFThumbnailViewer({ + container: appConfig.sidebar.thumbnailView, + eventBus, + renderingQueue, + linkService, + maxCanvasPixels, + maxCanvasDim, + pageColors, + abortSignal, + enableHWA + }); + renderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); + } + if (!this.isViewerEmbedded && !AppOptions.get("disableHistory")) { + this.pdfHistory = new PDFHistory({ + linkService, + eventBus + }); + linkService.setHistory(this.pdfHistory); + } + if (!this.supportsIntegratedFind && appConfig.findBar) { + this.findBar = new PDFFindBar(appConfig.findBar, appConfig.principalContainer, eventBus); + } + if (appConfig.annotationEditorParams) { + if (annotationEditorMode !== AnnotationEditorType.DISABLE) { + const editorSignatureButton = appConfig.toolbar?.editorSignatureButton; + if (editorSignatureButton && AppOptions.get("enableSignatureEditor")) { + editorSignatureButton.parentElement.hidden = false; + } + const editorCommentButton = appConfig.toolbar?.editorCommentButton; + if (editorCommentButton && AppOptions.get("enableComment")) { + editorCommentButton.parentElement.hidden = false; + } + this.annotationEditorParams = new AnnotationEditorParams(appConfig.annotationEditorParams, eventBus); + } else { + for (const id of ["editorModeButtons", "editorModeSeparator"]) { + document.getElementById(id)?.classList.add("hidden"); + } + } + } + if (mlManager && appConfig.secondaryToolbar?.imageAltTextSettingsButton) { + this.imageAltTextSettings = new ImageAltTextSettings(appConfig.altTextSettingsDialog, overlayManager, eventBus, mlManager); + } + if (appConfig.documentProperties) { + this.pdfDocumentProperties = new PDFDocumentProperties(appConfig.documentProperties, overlayManager, eventBus, l10n, () => this._docFilename, () => this._docTitle); + } + if (appConfig.secondaryToolbar?.cursorHandToolButton) { + this.pdfCursorTools = new PDFCursorTools({ + container, + eventBus, + cursorToolOnLoad: AppOptions.get("cursorToolOnLoad") + }); + } + if (appConfig.toolbar) { + this.toolbar = new Toolbar(appConfig.toolbar, eventBus, AppOptions.get("toolbarDensity")); + } + if (appConfig.secondaryToolbar) { + if (AppOptions.get("enableAltText")) { + appConfig.secondaryToolbar.imageAltTextSettingsButton?.classList.remove("hidden"); + appConfig.secondaryToolbar.imageAltTextSettingsSeparator?.classList.remove("hidden"); + } + this.secondaryToolbar = new SecondaryToolbar(appConfig.secondaryToolbar, eventBus); + } + if (this.supportsFullscreen && appConfig.secondaryToolbar?.presentationModeButton) { + this.pdfPresentationMode = new PDFPresentationMode({ + container, + pdfViewer, + eventBus + }); + } + if (appConfig.passwordOverlay) { + this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay, overlayManager, this.isViewerEmbedded); + } + if (appConfig.sidebar?.outlineView) { + this.pdfOutlineViewer = new PDFOutlineViewer({ + container: appConfig.sidebar.outlineView, + eventBus, + l10n, + linkService, + downloadManager + }); + } + if (appConfig.sidebar?.attachmentsView) { + this.pdfAttachmentViewer = new PDFAttachmentViewer({ + container: appConfig.sidebar.attachmentsView, + eventBus, + l10n, + downloadManager + }); + } + if (appConfig.sidebar?.layersView) { + this.pdfLayerViewer = new PDFLayerViewer({ + container: appConfig.sidebar.layersView, + eventBus, + l10n + }); + } + if (appConfig.sidebar) { + this.pdfSidebar = new PDFSidebar({ + elements: appConfig.sidebar, + eventBus, + l10n + }); + this.pdfSidebar.onToggled = this.forceRendering.bind(this); + this.pdfSidebar.onUpdateThumbnails = () => { + for (const pageView of pdfViewer.getCachedPageViews()) { + if (pageView.renderingState === RenderingStates.FINISHED) { + this.pdfThumbnailViewer.getThumbnail(pageView.id - 1)?.setImage(pageView); + } + } + this.pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); + }; + } + }, + async run(config) { + await this.initialize(config); + const { + appConfig, + eventBus + } = this; + let file; + const queryString = document.location.search.substring(1); + const params = parseQueryString(queryString); + file = params.get("file") ?? AppOptions.get("defaultUrl"); + try { + file = new URL(decodeURIComponent(file)).href; + } catch { + file = encodeURIComponent(file).replaceAll("%2F", "/"); + } + validateFileURL(file); + const fileInput = this._openFileInput = document.createElement("input"); + fileInput.id = "fileInput"; + fileInput.hidden = true; + fileInput.type = "file"; + fileInput.value = null; + document.body.append(fileInput); + fileInput.addEventListener("change", function (evt) { + const { + files + } = evt.target; + if (!files || files.length === 0) { + return; + } + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.target + }); + }); + appConfig.mainContainer.addEventListener("dragover", function (evt) { + for (const item of evt.dataTransfer.items) { + if (item.type === "application/pdf") { + evt.dataTransfer.dropEffect = evt.dataTransfer.effectAllowed === "copy" ? "copy" : "move"; + stopEvent(evt); + return; + } + } + }); + appConfig.mainContainer.addEventListener("drop", function (evt) { + if (evt.dataTransfer.files?.[0].type !== "application/pdf") { + return; + } + stopEvent(evt); + eventBus.dispatch("fileinputchange", { + source: this, + fileInput: evt.dataTransfer + }); + }); + if (!AppOptions.get("supportsDocumentFonts")) { + AppOptions.set("disableFontFace", true); + this.l10n.get("pdfjs-web-fonts-disabled").then(msg => { + console.warn(msg); + }); + } + const togglePrintingButtons = visible => { + appConfig.toolbar?.print?.classList.toggle("hidden", !visible); + appConfig.secondaryToolbar?.printButton.classList.toggle("hidden", !visible); + }; + if (!this.supportsPrinting) { + togglePrintingButtons(false); + } else { + eventBus.on("printingallowed", ({ + isAllowed + }) => togglePrintingButtons(isAllowed)); + } + if (!this.supportsFullscreen) { + appConfig.secondaryToolbar?.presentationModeButton.classList.add("hidden"); + } + if (this.supportsIntegratedFind) { + appConfig.findBar?.toggleButton?.classList.add("hidden"); + } + if (file) { + this.open({ + url: file + }); + } else { + this._hideViewBookmark(); + } + }, + get externalServices() { + return shadow(this, "externalServices", new ExternalServices()); + }, + get initialized() { + return this._initializedCapability.settled; + }, + get initializedPromise() { + return this._initializedCapability.promise; + }, + updateZoom(steps, scaleFactor, origin) { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.updateScale({ + drawingDelay: AppOptions.get("defaultZoomDelay"), + steps, + scaleFactor, + origin + }); + }, + zoomIn() { + this.updateZoom(1); + }, + zoomOut() { + this.updateZoom(-1); + }, + zoomReset() { + if (this.pdfViewer.isInPresentationMode) { + return; + } + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + }, + touchPinchCallback(origin, prevDistance, distance) { + if (this.supportsPinchToZoom) { + const newScaleFactor = this._accumulateFactor(this.pdfViewer.currentScale, distance / prevDistance, "_touchUnusedFactor"); + this.updateZoom(null, newScaleFactor, origin); + } else { + const PIXELS_PER_LINE_SCALE = 30; + const ticks = this._accumulateTicks((distance - prevDistance) / PIXELS_PER_LINE_SCALE, "_touchUnusedTicks"); + this.updateZoom(ticks, null, origin); + } + }, + touchPinchEndCallback() { + this._touchUnusedTicks = 0; + this._touchUnusedFactor = 1; + }, + get pagesCount() { + return this.pdfDocument ? this.pdfDocument.numPages : 0; + }, + get page() { + return this.pdfViewer.currentPageNumber; + }, + set page(val) { + this.pdfViewer.currentPageNumber = val; + }, + get supportsPrinting() { + return shadow(this, "supportsPrinting", AppOptions.get("supportsPrinting") && PDFPrintServiceFactory.supportsPrinting); + }, + get supportsFullscreen() { + return shadow(this, "supportsFullscreen", document.fullscreenEnabled); + }, + get supportsPinchToZoom() { + return shadow(this, "supportsPinchToZoom", AppOptions.get("supportsPinchToZoom")); + }, + get supportsIntegratedFind() { + return shadow(this, "supportsIntegratedFind", AppOptions.get("supportsIntegratedFind")); + }, + get loadingBar() { + const barElement = document.getElementById("loadingBar"); + const bar = barElement ? new ProgressBar(barElement) : null; + return shadow(this, "loadingBar", bar); + }, + get supportsMouseWheelZoomCtrlKey() { + return shadow(this, "supportsMouseWheelZoomCtrlKey", AppOptions.get("supportsMouseWheelZoomCtrlKey")); + }, + get supportsMouseWheelZoomMetaKey() { + return shadow(this, "supportsMouseWheelZoomMetaKey", AppOptions.get("supportsMouseWheelZoomMetaKey")); + }, + get supportsCaretBrowsingMode() { + return AppOptions.get("supportsCaretBrowsingMode"); + }, + moveCaret(isUp, select) { + this._caretBrowsing ||= new CaretBrowsingMode(this._globalAbortController.signal, this.appConfig.mainContainer, this.appConfig.viewerContainer, this.appConfig.toolbar?.container); + this._caretBrowsing.moveCaret(isUp, select); + }, + setTitleUsingUrl(url = "", downloadUrl = null) { + this.url = url; + this.baseUrl = updateUrlHash(url, "", true); + if (downloadUrl) { + this._downloadUrl = downloadUrl === url ? this.baseUrl : updateUrlHash(downloadUrl, "", true); + } + if (isDataScheme(url)) { + this._hideViewBookmark(); + } + let title = pdfjs_getPdfFilenameFromUrl(url, ""); + if (!title) { + try { + title = decodeURIComponent(getFilenameFromUrl(url)); + } catch {} + } + this.setTitle(title || url); + }, + setTitle(title = this._title) { + this._title = title; + if (this.isViewerEmbedded) { + return; + } + const editorIndicator = this._hasAnnotationEditors && !this.pdfRenderingQueue.printing; + document.title = `${editorIndicator ? "* " : ""}${title}`; + }, + get _docFilename() { + return this._contentDispositionFilename || pdfjs_getPdfFilenameFromUrl(this.url); + }, + get _docTitle() { + const { + documentInfo, + metadata + } = this; + const title = metadata?.get("dc:title"); + if (title) { + if (title !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(title)) { + return title; + } + } + return documentInfo.Title; + }, + _hideViewBookmark() { + const { + secondaryToolbar + } = this.appConfig; + secondaryToolbar?.viewBookmarkButton.classList.add("hidden"); + if (secondaryToolbar?.presentationModeButton.classList.contains("hidden")) { + document.getElementById("viewBookmarkSeparator")?.classList.add("hidden"); + } + }, + async close() { + this._unblockDocumentLoadEvent(); + this._hideViewBookmark(); + if (!this.pdfLoadingTask) { + return; + } + if (this.pdfDocument?.annotationStorage.size > 0 && this._annotationStorageModified) { + try { + await this.save(); + } catch {} + } + const promises = []; + promises.push(this.pdfLoadingTask.destroy()); + this.pdfLoadingTask = null; + if (this.pdfDocument) { + this.pdfDocument = null; + this.pdfThumbnailViewer?.setDocument(null); + this.pdfViewer.setDocument(null); + this.pdfLinkService.setDocument(null); + this.pdfDocumentProperties?.setDocument(null); + } + this.pdfLinkService.externalLinkEnabled = true; + this.store = null; + this.isInitialViewSet = false; + this.url = ""; + this.baseUrl = ""; + this._downloadUrl = ""; + this.documentInfo = null; + this.metadata = null; + this._contentDispositionFilename = null; + this._contentLength = null; + this._saveInProgress = false; + this._hasAnnotationEditors = false; + promises.push(this.pdfScriptingManager.destroyPromise, this.passwordPrompt.close()); + this.setTitle(); + this.pdfSidebar?.reset(); + this.pdfOutlineViewer?.reset(); + this.pdfAttachmentViewer?.reset(); + this.pdfLayerViewer?.reset(); + this.pdfHistory?.reset(); + this.findBar?.reset(); + this.toolbar?.reset(); + this.secondaryToolbar?.reset(); + this._PDFBug?.cleanup(); + await Promise.all(promises); + }, + async open(args) { + if (this.pdfLoadingTask) { + await this.close(); + } + const workerParams = AppOptions.getAll(OptionKind.WORKER); + Object.assign(GlobalWorkerOptions, workerParams); + if (args.url) { + this.setTitleUsingUrl(args.originalUrl || args.url, args.url); + } + const apiParams = AppOptions.getAll(OptionKind.API); + const loadingTask = getDocument({ + ...apiParams, + ...args + }); + this.pdfLoadingTask = loadingTask; + loadingTask.onPassword = (updateCallback, reason) => { + if (this.isViewerEmbedded) { + this._unblockDocumentLoadEvent(); + } + this.pdfLinkService.externalLinkEnabled = false; + this.passwordPrompt.setUpdateCallback(updateCallback, reason); + this.passwordPrompt.open(); + }; + loadingTask.onProgress = ({ + loaded, + total + }) => { + this.progress(loaded / total); + }; + return loadingTask.promise.then(pdfDocument => { + this.load(pdfDocument); + }, reason => { + if (loadingTask !== this.pdfLoadingTask) { + return undefined; + } + let key = "pdfjs-loading-error"; + if (reason instanceof InvalidPDFException) { + key = "pdfjs-invalid-file-error"; + } else if (reason instanceof ResponseException) { + key = reason.missing ? "pdfjs-missing-file-error" : "pdfjs-unexpected-response-error"; + } + return this._documentError(key, { + message: reason.message + }).then(() => { + throw reason; + }); + }); + }, + async download() { + let data; + try { + data = await (this.pdfDocument ? this.pdfDocument.getData() : this.pdfLoadingTask.getData()); + } catch {} + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + }, + async save() { + if (this._saveInProgress) { + return; + } + this._saveInProgress = true; + await this.pdfScriptingManager.dispatchWillSave(); + try { + const data = await this.pdfDocument.saveDocument(); + this.downloadManager.download(data, this._downloadUrl, this._docFilename); + } catch (reason) { + console.error(`Error when saving the document:`, reason); + await this.download(); + } finally { + await this.pdfScriptingManager.dispatchDidSave(); + this._saveInProgress = false; + } + const editorStats = this.pdfDocument?.annotationStorage.editorStats; + if (editorStats) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "save", + stats: editorStats + } + }); + } + }, + async downloadOrSave() { + const { + classList + } = this.appConfig.appContainer; + classList.add("wait"); + await (this.pdfDocument?.annotationStorage.size > 0 ? this.save() : this.download()); + classList.remove("wait"); + }, + async _documentError(key, moreInfo = null) { + this._unblockDocumentLoadEvent(); + const message = await this._otherError(key || "pdfjs-loading-error", moreInfo); + this.eventBus.dispatch("documenterror", { + source: this, + message, + reason: moreInfo?.message ?? null + }); + }, + async _otherError(key, moreInfo = null) { + const message = await this.l10n.get(key); + const moreInfoText = [`PDF.js v${version || "?"} (build: ${build || "?"})`]; + if (moreInfo) { + moreInfoText.push(`Message: ${moreInfo.message}`); + if (moreInfo.stack) { + moreInfoText.push(`Stack: ${moreInfo.stack}`); + } else { + if (moreInfo.filename) { + moreInfoText.push(`File: ${moreInfo.filename}`); + } + if (moreInfo.lineNumber) { + moreInfoText.push(`Line: ${moreInfo.lineNumber}`); + } + } + } + console.error(`${message}\n\n${moreInfoText.join("\n")}`); + return message; + }, + progress(level) { + const percent = Math.round(level * 100); + if (!this.loadingBar || percent <= this.loadingBar.percent) { + return; + } + this.loadingBar.percent = percent; + if (this.pdfDocument?.loadingParams.disableAutoFetch ?? AppOptions.get("disableAutoFetch")) { + this.loadingBar.setDisableAutoFetch(); + } + }, + load(pdfDocument) { + this.pdfDocument = pdfDocument; + this._printPermissionPromise = new Promise(resolve => { + this.eventBus.on("printingallowed", ({ + isAllowed + }) => { + resolve(isAllowed); + }, { + once: true + }); + }); + pdfDocument.getDownloadInfo().then(({ + length + }) => { + this._contentLength = length; + this.loadingBar?.hide(); + firstPagePromise.then(() => { + this.eventBus.dispatch("documentloaded", { + source: this + }); + }); + }); + const pageLayoutPromise = pdfDocument.getPageLayout().catch(() => {}); + const pageModePromise = pdfDocument.getPageMode().catch(() => {}); + const openActionPromise = pdfDocument.getOpenAction().catch(() => {}); + this.toolbar?.setPagesCount(pdfDocument.numPages, false); + this.secondaryToolbar?.setPagesCount(pdfDocument.numPages); + this.pdfLinkService.setDocument(pdfDocument); + this.pdfDocumentProperties?.setDocument(pdfDocument); + const pdfViewer = this.pdfViewer; + pdfViewer.setDocument(pdfDocument); + const { + firstPagePromise, + onePageRendered, + pagesPromise + } = pdfViewer; + this.pdfThumbnailViewer?.setDocument(pdfDocument); + const storedPromise = (this.store = new ViewHistory(pdfDocument.fingerprints[0])).getMultiple({ + page: null, + zoom: DEFAULT_SCALE_VALUE, + scrollLeft: "0", + scrollTop: "0", + rotation: null, + sidebarView: SidebarView.UNKNOWN, + scrollMode: ScrollMode.UNKNOWN, + spreadMode: SpreadMode.UNKNOWN + }).catch(() => {}); + firstPagePromise.then(pdfPage => { + this.loadingBar?.setWidth(this.appConfig.viewerContainer); + this._initializeAnnotationStorageCallbacks(pdfDocument); + Promise.all([animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { + const viewOnLoad = AppOptions.get("viewOnLoad"); + this._initializePdfHistory({ + fingerprint: pdfDocument.fingerprints[0], + viewOnLoad, + initialDest: openAction?.dest + }); + const initialBookmark = this.initialBookmark; + const zoom = AppOptions.get("defaultZoomValue"); + let hash = zoom ? `zoom=${zoom}` : null; + let rotation = null; + let sidebarView = AppOptions.get("sidebarViewOnLoad"); + let scrollMode = AppOptions.get("scrollModeOnLoad"); + let spreadMode = AppOptions.get("spreadModeOnLoad"); + if (stored?.page && viewOnLoad !== ViewOnLoad.INITIAL) { + hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; + rotation = parseInt(stored.rotation, 10); + if (sidebarView === SidebarView.UNKNOWN) { + sidebarView = stored.sidebarView | 0; + } + if (scrollMode === ScrollMode.UNKNOWN) { + scrollMode = stored.scrollMode | 0; + } + if (spreadMode === SpreadMode.UNKNOWN) { + spreadMode = stored.spreadMode | 0; + } + } + if (pageMode && sidebarView === SidebarView.UNKNOWN) { + sidebarView = apiPageModeToSidebarView(pageMode); + } + if (pageLayout && scrollMode === ScrollMode.UNKNOWN && spreadMode === SpreadMode.UNKNOWN) { + const modes = apiPageLayoutToViewerModes(pageLayout); + spreadMode = modes.spreadMode; + } + this.setInitialView(hash, { + rotation, + sidebarView, + scrollMode, + spreadMode + }); + this.eventBus.dispatch("documentinit", { + source: this + }); + await Promise.race([pagesPromise, new Promise(resolve => { + setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); + })]); + if (!initialBookmark && !hash) { + return; + } + if (pdfViewer.hasEqualPageSizes) { + return; + } + this.initialBookmark = initialBookmark; + pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; + this.setInitialView(hash); + }).catch(() => { + this.setInitialView(); + }).then(function () { + pdfViewer.update(); + }); + }); + pagesPromise.then(() => { + this._unblockDocumentLoadEvent(); + this._initializeAutoPrint(pdfDocument, openActionPromise); + }, reason => { + this._documentError("pdfjs-loading-error", { + message: reason.message + }); + }); + onePageRendered.then(data => { + this.externalServices.reportTelemetry({ + type: "pageInfo", + timestamp: data.timestamp + }); + if (this.pdfOutlineViewer) { + pdfDocument.getOutline().then(outline => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfOutlineViewer.render({ + outline, + pdfDocument + }); + }); + } + if (this.pdfAttachmentViewer) { + pdfDocument.getAttachments().then(attachments => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfAttachmentViewer.render({ + attachments + }); + }); + } + if (this.pdfLayerViewer) { + pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { + if (pdfDocument !== this.pdfDocument) { + return; + } + this.pdfLayerViewer.render({ + optionalContentConfig, + pdfDocument + }); + }); + } + }); + this._initializePageLabels(pdfDocument); + this._initializeMetadata(pdfDocument); + }, + async _scriptingDocProperties(pdfDocument) { + if (!this.documentInfo) { + await new Promise(resolve => { + this.eventBus._on("metadataloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + if (!this._contentLength) { + await new Promise(resolve => { + this.eventBus._on("documentloaded", resolve, { + once: true + }); + }); + if (pdfDocument !== this.pdfDocument) { + return null; + } + } + return { + ...this.documentInfo, + baseURL: this.baseUrl, + filesize: this._contentLength, + filename: this._docFilename, + metadata: this.metadata?.getRaw(), + authors: this.metadata?.get("dc:creator"), + numPages: this.pagesCount, + URL: this.url + }; + }, + async _initializeAutoPrint(pdfDocument, openActionPromise) { + const [openAction, jsActions] = await Promise.all([openActionPromise, this.pdfViewer.enableScripting ? null : pdfDocument.getJSActions()]); + if (pdfDocument !== this.pdfDocument) { + return; + } + let triggerAutoPrint = openAction?.action === "Print"; + if (jsActions) { + console.warn("Warning: JavaScript support is not enabled"); + for (const name in jsActions) { + if (triggerAutoPrint) { + break; + } + switch (name) { + case "WillClose": + case "WillSave": + case "DidSave": + case "WillPrint": + case "DidPrint": + continue; + } + triggerAutoPrint = jsActions[name].some(js => AutoPrintRegExp.test(js)); + } + } + if (triggerAutoPrint) { + this.triggerPrinting(); + } + }, + async _initializeMetadata(pdfDocument) { + const { + info, + metadata, + contentDispositionFilename, + contentLength + } = await pdfDocument.getMetadata(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (info.collectedSignatureCertificates) { + this.externalServices.reportTelemetry({ + type: "signatureCertificates", + data: info.collectedSignatureCertificates + }); + } + this.documentInfo = info; + this.metadata = metadata; + this._contentDispositionFilename ??= contentDispositionFilename; + this._contentLength ??= contentLength; + console.log(`PDF ${pdfDocument.fingerprints[0]} [${info.PDFFormatVersion} ` + `${(metadata?.get("pdf:producer") || info.Producer || "-").trim()} / ` + `${(metadata?.get("xmp:creatortool") || info.Creator || "-").trim()}` + `] (PDF.js: ${version || "?"} [${build || "?"}])`); + const pdfTitle = this._docTitle; + if (pdfTitle) { + this.setTitle(`${pdfTitle} - ${this._contentDispositionFilename || this._title}`); + } else if (this._contentDispositionFilename) { + this.setTitle(this._contentDispositionFilename); + } + if (info.IsXFAPresent && !info.IsAcroFormPresent && !pdfDocument.isPureXfa) { + if (pdfDocument.loadingParams.enableXfa) { + console.warn("Warning: XFA Foreground documents are not supported"); + } else { + console.warn("Warning: XFA support is not enabled"); + } + } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderForms) { + console.warn("Warning: Interactive form support is not enabled"); + } + if (info.IsSignaturesPresent) { + console.warn("Warning: Digital signatures validation is not supported"); + } + this.eventBus.dispatch("metadataloaded", { + source: this + }); + }, + async _initializePageLabels(pdfDocument) { + const labels = await pdfDocument.getPageLabels(); + if (pdfDocument !== this.pdfDocument) { + return; + } + if (!labels || AppOptions.get("disablePageLabels")) { + return; + } + const numLabels = labels.length; + let standardLabels = 0, + emptyLabels = 0; + for (let i = 0; i < numLabels; i++) { + const label = labels[i]; + if (label === (i + 1).toString()) { + standardLabels++; + } else if (label === "") { + emptyLabels++; + } else { + break; + } + } + if (standardLabels >= numLabels || emptyLabels >= numLabels) { + return; + } + const { + pdfViewer, + pdfThumbnailViewer, + toolbar + } = this; + pdfViewer.setPageLabels(labels); + pdfThumbnailViewer?.setPageLabels(labels); + toolbar?.setPagesCount(numLabels, true); + toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + }, + _initializePdfHistory({ + fingerprint, + viewOnLoad, + initialDest = null + }) { + if (!this.pdfHistory) { + return; + } + this.pdfHistory.initialize({ + fingerprint, + resetHistory: viewOnLoad === ViewOnLoad.INITIAL, + updateUrl: AppOptions.get("historyUpdateUrl") + }); + if (this.pdfHistory.initialBookmark) { + this.initialBookmark = this.pdfHistory.initialBookmark; + this.initialRotation = this.pdfHistory.initialRotation; + } + if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { + this.initialBookmark = JSON.stringify(initialDest); + this.pdfHistory.push({ + explicitDest: initialDest, + pageNumber: null + }); + } + }, + _initializeAnnotationStorageCallbacks(pdfDocument) { + if (pdfDocument !== this.pdfDocument) { + return; + } + const { + annotationStorage + } = pdfDocument; + annotationStorage.onSetModified = () => { + window.addEventListener("beforeunload", beforeUnload); + this._annotationStorageModified = true; + }; + annotationStorage.onResetModified = () => { + window.removeEventListener("beforeunload", beforeUnload); + delete this._annotationStorageModified; + }; + annotationStorage.onAnnotationEditor = typeStr => { + this._hasAnnotationEditors = !!typeStr; + this.setTitle(); + }; + }, + setInitialView(storedHash, { + rotation, + sidebarView, + scrollMode, + spreadMode + } = {}) { + const setRotation = angle => { + if (isValidRotation(angle)) { + this.pdfViewer.pagesRotation = angle; + } + }; + const setViewerModes = (scroll, spread) => { + if (isValidScrollMode(scroll)) { + this.pdfViewer.scrollMode = scroll; + } + if (isValidSpreadMode(spread)) { + this.pdfViewer.spreadMode = spread; + } + }; + this.isInitialViewSet = true; + this.pdfSidebar?.setInitialView(sidebarView); + setViewerModes(scrollMode, spreadMode); + if (this.initialBookmark) { + setRotation(this.initialRotation); + delete this.initialRotation; + this.pdfLinkService.setHash(this.initialBookmark); + this.initialBookmark = null; + } else if (storedHash) { + setRotation(rotation); + this.pdfLinkService.setHash(storedHash); + } + this.toolbar?.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); + this.secondaryToolbar?.setPageNumber(this.pdfViewer.currentPageNumber); + if (!this.pdfViewer.currentScaleValue) { + this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE; + } + }, + _cleanup() { + if (!this.pdfDocument) { + return; + } + this.pdfViewer.cleanup(); + this.pdfThumbnailViewer?.cleanup(); + this.pdfDocument.cleanup(AppOptions.get("fontExtraProperties")); + }, + forceRendering() { + this.pdfRenderingQueue.printing = !!this.printService; + this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar?.visibleView === SidebarView.THUMBS; + this.pdfRenderingQueue.renderHighestPriority(); + }, + beforePrint() { + this._printAnnotationStoragePromise = this.pdfScriptingManager.dispatchWillPrint().catch(() => {}).then(() => this.pdfDocument?.annotationStorage.print); + if (this.printService) { + return; + } + if (!this.supportsPrinting || !this.pdfViewer.printingAllowed) { + this._otherError("pdfjs-printing-not-supported"); + return; + } + if (!this.pdfViewer.pageViewsReady) { + this.l10n.get("pdfjs-printing-not-ready").then(msg => { + window.alert(msg); + }); + return; + } + this.printService = PDFPrintServiceFactory.createPrintService({ + pdfDocument: this.pdfDocument, + pagesOverview: this.pdfViewer.getPagesOverview(), + printContainer: this.appConfig.printContainer, + printResolution: AppOptions.get("printResolution"), + printAnnotationStoragePromise: this._printAnnotationStoragePromise + }); + this.forceRendering(); + this.setTitle(); + this.printService.layout(); + if (this._hasAnnotationEditors) { + this.externalServices.reportTelemetry({ + type: "editing", + data: { + type: "print", + stats: this.pdfDocument?.annotationStorage.editorStats + } + }); + } + }, + afterPrint() { + if (this._printAnnotationStoragePromise) { + this._printAnnotationStoragePromise.then(() => { + this.pdfScriptingManager.dispatchDidPrint(); + }); + this._printAnnotationStoragePromise = null; + } + if (this.printService) { + this.printService.destroy(); + this.printService = null; + this.pdfDocument?.annotationStorage.resetModified(); + } + this.forceRendering(); + this.setTitle(); + }, + rotatePages(delta) { + this.pdfViewer.pagesRotation += delta; + }, + requestPresentationMode() { + this.pdfPresentationMode?.request(); + }, + async triggerPrinting() { + if (this.supportsPrinting && (await this._printPermissionPromise)) { + window.print(); + } + }, + bindEvents() { + if (this._eventBusAbortController) { + return; + } + const ac = this._eventBusAbortController = new AbortController(); + const opts = { + signal: ac.signal + }; + const { + eventBus, + externalServices, + pdfDocumentProperties, + pdfViewer, + preferences + } = this; + eventBus._on("resize", onResize.bind(this), opts); + eventBus._on("hashchange", onHashchange.bind(this), opts); + eventBus._on("beforeprint", this.beforePrint.bind(this), opts); + eventBus._on("afterprint", this.afterPrint.bind(this), opts); + eventBus._on("pagerender", onPageRender.bind(this), opts); + eventBus._on("pagerendered", onPageRendered.bind(this), opts); + eventBus._on("updateviewarea", onUpdateViewarea.bind(this), opts); + eventBus._on("pagechanging", onPageChanging.bind(this), opts); + eventBus._on("scalechanging", onScaleChanging.bind(this), opts); + eventBus._on("rotationchanging", onRotationChanging.bind(this), opts); + eventBus._on("sidebarviewchanged", onSidebarViewChanged.bind(this), opts); + eventBus._on("pagemode", onPageMode.bind(this), opts); + eventBus._on("namedaction", onNamedAction.bind(this), opts); + eventBus._on("presentationmodechanged", evt => pdfViewer.presentationModeState = evt.state, opts); + eventBus._on("presentationmode", this.requestPresentationMode.bind(this), opts); + eventBus._on("switchannotationeditormode", evt => pdfViewer.annotationEditorMode = evt, opts); + eventBus._on("print", this.triggerPrinting.bind(this), opts); + eventBus._on("download", this.downloadOrSave.bind(this), opts); + eventBus._on("firstpage", () => this.page = 1, opts); + eventBus._on("lastpage", () => this.page = this.pagesCount, opts); + eventBus._on("nextpage", () => pdfViewer.nextPage(), opts); + eventBus._on("previouspage", () => pdfViewer.previousPage(), opts); + eventBus._on("zoomin", this.zoomIn.bind(this), opts); + eventBus._on("zoomout", this.zoomOut.bind(this), opts); + eventBus._on("zoomreset", this.zoomReset.bind(this), opts); + eventBus._on("pagenumberchanged", onPageNumberChanged.bind(this), opts); + eventBus._on("scalechanged", evt => pdfViewer.currentScaleValue = evt.value, opts); + eventBus._on("rotatecw", this.rotatePages.bind(this, 90), opts); + eventBus._on("rotateccw", this.rotatePages.bind(this, -90), opts); + eventBus._on("optionalcontentconfig", evt => pdfViewer.optionalContentConfigPromise = evt.promise, opts); + eventBus._on("switchscrollmode", evt => pdfViewer.scrollMode = evt.mode, opts); + eventBus._on("scrollmodechanged", onViewerModesChanged.bind(this, "scrollMode"), opts); + eventBus._on("switchspreadmode", evt => pdfViewer.spreadMode = evt.mode, opts); + eventBus._on("spreadmodechanged", onViewerModesChanged.bind(this, "spreadMode"), opts); + eventBus._on("imagealttextsettings", onImageAltTextSettings.bind(this), opts); + eventBus._on("documentproperties", () => pdfDocumentProperties?.open(), opts); + eventBus._on("findfromurlhash", onFindFromUrlHash.bind(this), opts); + eventBus._on("updatefindmatchescount", onUpdateFindMatchesCount.bind(this), opts); + eventBus._on("updatefindcontrolstate", onUpdateFindControlState.bind(this), opts); + eventBus._on("fileinputchange", onFileInputChange.bind(this), opts); + eventBus._on("openfile", onOpenFile.bind(this), opts); + }, + bindWindowEvents() { + if (this._windowAbortController) { + return; + } + this._windowAbortController = new AbortController(); + const { + eventBus, + appConfig: { + mainContainer + }, + pdfViewer, + _windowAbortController: { + signal + } + } = this; + this._touchManager = new TouchManager({ + container: window, + isPinchingDisabled: () => pdfViewer.isInPresentationMode, + isPinchingStopped: () => this.overlayManager?.active, + onPinching: this.touchPinchCallback.bind(this), + onPinchEnd: this.touchPinchEndCallback.bind(this), + signal + }); + function addWindowResolutionChange(evt = null) { + if (evt) { + pdfViewer.refresh(); + } + const mediaQueryList = window.matchMedia(`(resolution: ${OutputScale.pixelRatio}dppx)`); + mediaQueryList.addEventListener("change", addWindowResolutionChange, { + once: true, + signal + }); + } + addWindowResolutionChange(); + window.addEventListener("wheel", onWheel.bind(this), { + passive: false, + signal + }); + window.addEventListener("click", onClick.bind(this), { + signal + }); + window.addEventListener("keydown", onKeyDown.bind(this), { + signal + }); + window.addEventListener("keyup", onKeyUp.bind(this), { + signal + }); + window.addEventListener("resize", () => eventBus.dispatch("resize", { + source: window + }), { + signal + }); + window.addEventListener("hashchange", () => { + eventBus.dispatch("hashchange", { + source: window, + hash: document.location.hash.substring(1) + }); + }, { + signal + }); + window.addEventListener("beforeprint", () => eventBus.dispatch("beforeprint", { + source: window + }), { + signal + }); + window.addEventListener("afterprint", () => eventBus.dispatch("afterprint", { + source: window + }), { + signal + }); + window.addEventListener("updatefromsandbox", evt => { + eventBus.dispatch("updatefromsandbox", { + source: window, + detail: evt.detail + }); + }, { + signal + }); + if (!("onscrollend" in document.documentElement)) { + return; + } + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + let scrollendTimeoutID, scrollAbortController; + const scrollend = () => { + ({ + scrollTop: this._lastScrollTop, + scrollLeft: this._lastScrollLeft + } = mainContainer); + clearTimeout(scrollendTimeoutID); + if (this._isScrolling) { + scrollAbortController.abort(); + scrollAbortController = null; + this._isScrolling = false; + } + }; + const scroll = () => { + if (this._isCtrlKeyDown) { + return; + } + if (this._lastScrollTop === mainContainer.scrollTop && this._lastScrollLeft === mainContainer.scrollLeft) { + return; + } + if (!this._isScrolling) { + scrollAbortController = new AbortController(); + const abortSignal = AbortSignal.any([scrollAbortController.signal, signal]); + mainContainer.addEventListener("scrollend", scrollend, { + signal: abortSignal + }); + mainContainer.addEventListener("blur", scrollend, { + signal: abortSignal + }); + this._isScrolling = true; + } + clearTimeout(scrollendTimeoutID); + scrollendTimeoutID = setTimeout(scrollend, 100); + }; + mainContainer.addEventListener("scroll", scroll, { + passive: true, + signal + }); + }, + unbindEvents() { + this._eventBusAbortController?.abort(); + this._eventBusAbortController = null; + }, + unbindWindowEvents() { + this._windowAbortController?.abort(); + this._windowAbortController = null; + this._touchManager = null; + }, + async testingClose() { + this.unbindEvents(); + this.unbindWindowEvents(); + this._globalAbortController?.abort(); + this._globalAbortController = null; + this.findBar?.close(); + await Promise.all([this.l10n?.destroy(), this.close()]); + }, + _accumulateTicks(ticks, prop) { + if (this[prop] > 0 && ticks < 0 || this[prop] < 0 && ticks > 0) { + this[prop] = 0; + } + this[prop] += ticks; + const wholeTicks = Math.trunc(this[prop]); + this[prop] -= wholeTicks; + return wholeTicks; + }, + _accumulateFactor(previousScale, factor, prop) { + if (factor === 1) { + return 1; + } + if (this[prop] > 1 && factor < 1 || this[prop] < 1 && factor > 1) { + this[prop] = 1; + } + const newFactor = Math.floor(previousScale * factor * this[prop] * 100) / (100 * previousScale); + this[prop] = factor / newFactor; + return newFactor; + }, + _unblockDocumentLoadEvent() { + document.blockUnblockOnload?.(false); + this._unblockDocumentLoadEvent = () => {}; + }, + get scriptingReady() { + return this.pdfScriptingManager.ready; + } +}; +initCom(PDFViewerApplication); +{ + PDFPrintServiceFactory.initGlobals(PDFViewerApplication); +} +{ + const HOSTED_VIEWER_ORIGINS = new Set(["null", "http://mozilla.github.io", "https://mozilla.github.io"]); + var validateFileURL = function (file) { + if (!file) { + return; + } + const viewerOrigin = URL.parse(window.location)?.origin || "null"; + if (HOSTED_VIEWER_ORIGINS.has(viewerOrigin)) { + return; + } + const fileOrigin = URL.parse(file, window.location)?.origin; + if (fileOrigin === viewerOrigin) { + return; + } + const ex = new Error("file origin does not match viewer's"); + PDFViewerApplication._documentError("pdfjs-loading-error", { + message: ex.message + }); + throw ex; + }; + var onFileInputChange = function (evt) { + if (this.pdfViewer?.isInPresentationMode) { + return; + } + const file = evt.fileInput.files[0]; + this.open({ + url: URL.createObjectURL(file), + originalUrl: encodeURIComponent(file.name) + }); + }; + var onOpenFile = function (evt) { + this._openFileInput?.click(); + }; +} +function onPageRender({ + pageNumber +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(true); + } +} +function onPageRendered({ + pageNumber, + isDetailView, + error +}) { + if (pageNumber === this.page) { + this.toolbar?.updateLoadingIndicatorState(false); + } + if (!isDetailView && this.pdfSidebar?.visibleView === SidebarView.THUMBS) { + const pageView = this.pdfViewer.getPageView(pageNumber - 1); + const thumbnailView = this.pdfThumbnailViewer?.getThumbnail(pageNumber - 1); + if (pageView) { + thumbnailView?.setImage(pageView); + } + } + if (error) { + this._otherError("pdfjs-rendering-error", error); + } +} +function onPageMode({ + mode +}) { + let view; + switch (mode) { + case "thumbs": + view = SidebarView.THUMBS; + break; + case "bookmarks": + case "outline": + view = SidebarView.OUTLINE; + break; + case "attachments": + view = SidebarView.ATTACHMENTS; + break; + case "layers": + view = SidebarView.LAYERS; + break; + case "none": + view = SidebarView.NONE; + break; + default: + console.error('Invalid "pagemode" hash parameter: ' + mode); + return; + } + this.pdfSidebar?.switchView(view, true); +} +function onNamedAction(evt) { + switch (evt.action) { + case "GoToPage": + this.appConfig.toolbar?.pageNumber.select(); + break; + case "Find": + if (!this.supportsIntegratedFind) { + this.findBar?.toggle(); + } + break; + case "Print": + this.triggerPrinting(); + break; + case "SaveAs": + this.downloadOrSave(); + break; + } +} +function onSidebarViewChanged({ + view +}) { + this.pdfRenderingQueue.isThumbnailViewEnabled = view === SidebarView.THUMBS; + if (this.isInitialViewSet) { + this.store?.set("sidebarView", view).catch(() => {}); + } +} +function onUpdateViewarea({ + location +}) { + if (this.isInitialViewSet) { + this.store?.setMultiple({ + page: location.pageNumber, + zoom: location.scale, + scrollLeft: location.left, + scrollTop: location.top, + rotation: location.rotation + }).catch(() => {}); + } + if (this.appConfig.secondaryToolbar) { + this.appConfig.secondaryToolbar.viewBookmarkButton.href = this.pdfLinkService.getAnchorUrl(location.pdfOpenParams); + } +} +function onViewerModesChanged(name, evt) { + if (this.isInitialViewSet && !this.pdfViewer.isInPresentationMode) { + this.store?.set(name, evt.mode).catch(() => {}); + } +} +function onResize() { + const { + pdfDocument, + pdfViewer, + pdfRenderingQueue + } = this; + if (pdfRenderingQueue.printing && window.matchMedia("print").matches) { + return; + } + if (!pdfDocument) { + return; + } + const currentScaleValue = pdfViewer.currentScaleValue; + if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { + pdfViewer.currentScaleValue = currentScaleValue; + } + pdfViewer.update(); +} +function onHashchange(evt) { + const hash = evt.hash; + if (!hash) { + return; + } + if (!this.isInitialViewSet) { + this.initialBookmark = hash; + } else if (!this.pdfHistory?.popStateInProgress) { + this.pdfLinkService.setHash(hash); + } +} +function onPageNumberChanged(evt) { + const { + pdfViewer + } = this; + if (evt.value !== "") { + this.pdfLinkService.goToPage(evt.value); + } + if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { + this.toolbar?.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); + } +} +function onImageAltTextSettings() { + this.imageAltTextSettings?.open({ + enableGuessAltText: AppOptions.get("enableGuessAltText"), + enableNewAltTextWhenAddingImage: AppOptions.get("enableNewAltTextWhenAddingImage") + }); +} +function onFindFromUrlHash(evt) { + this.eventBus.dispatch("find", { + source: evt.source, + type: "", + query: evt.query, + caseSensitive: false, + entireWord: false, + highlightAll: true, + findPrevious: false, + matchDiacritics: true + }); +} +function onUpdateFindMatchesCount({ + matchesCount +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindMatchesCount(matchesCount); + } else { + this.findBar?.updateResultsCount(matchesCount); + } +} +function onUpdateFindControlState({ + state, + previous, + entireWord, + matchesCount, + rawQuery +}) { + if (this.supportsIntegratedFind) { + this.externalServices.updateFindControlState({ + result: state, + findPrevious: previous, + entireWord, + matchesCount, + rawQuery + }); + } else { + this.findBar?.updateUIState(state, previous, matchesCount); + } +} +function onScaleChanging(evt) { + this.toolbar?.setPageScale(evt.presetValue, evt.scale); + this.pdfViewer.update(); +} +function onRotationChanging(evt) { + if (this.pdfThumbnailViewer) { + this.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; + } + this.forceRendering(); + this.pdfViewer.currentPageNumber = evt.pageNumber; +} +function onPageChanging({ + pageNumber, + pageLabel +}) { + this.toolbar?.setPageNumber(pageNumber, pageLabel); + this.secondaryToolbar?.setPageNumber(pageNumber); + if (this.pdfSidebar?.visibleView === SidebarView.THUMBS) { + this.pdfThumbnailViewer?.scrollThumbnailIntoView(pageNumber); + } + const currentPage = this.pdfViewer.getPageView(pageNumber - 1); + this.toolbar?.updateLoadingIndicatorState(currentPage?.renderingState === RenderingStates.RUNNING); +} +function onWheel(evt) { + const { + pdfViewer, + supportsMouseWheelZoomCtrlKey, + supportsMouseWheelZoomMetaKey, + supportsPinchToZoom + } = this; + if (pdfViewer.isInPresentationMode) { + return; + } + const deltaMode = evt.deltaMode; + let scaleFactor = Math.exp(-evt.deltaY / 100); + const isBuiltInMac = false; + const isPinchToZoom = evt.ctrlKey && !this._isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && evt.deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isBuiltInMac) && evt.deltaZ === 0; + const origin = [evt.clientX, evt.clientY]; + if (isPinchToZoom || evt.ctrlKey && supportsMouseWheelZoomCtrlKey || evt.metaKey && supportsMouseWheelZoomMetaKey) { + evt.preventDefault(); + if (this._isScrolling || document.visibilityState === "hidden" || this.overlayManager.active) { + return; + } + if (isPinchToZoom && supportsPinchToZoom) { + scaleFactor = this._accumulateFactor(pdfViewer.currentScale, scaleFactor, "_wheelUnusedFactor"); + this.updateZoom(null, scaleFactor, origin); + } else { + const delta = normalizeWheelEventDirection(evt); + let ticks = 0; + if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) { + ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : this._accumulateTicks(delta, "_wheelUnusedTicks"); + } else { + const PIXELS_PER_LINE_SCALE = 30; + ticks = this._accumulateTicks(delta / PIXELS_PER_LINE_SCALE, "_wheelUnusedTicks"); + } + this.updateZoom(ticks, null, origin); + } + } +} +function closeSecondaryToolbar({ + target +}) { + if (!this.secondaryToolbar?.isOpen) { + return; + } + const { + toolbar, + secondaryToolbar + } = this.appConfig; + if (this.pdfViewer.containsElement(target) || toolbar?.container.contains(target) && !secondaryToolbar?.toolbar.contains(target) && !secondaryToolbar?.toggleButton.contains(target)) { + this.secondaryToolbar.close(); + } +} +function closeEditorUndoBar(evt) { + if (!this.editorUndoBar?.isOpen) { + return; + } + if (this.appConfig.secondaryToolbar?.toolbar.contains(evt.target)) { + this.editorUndoBar.hide(); + } +} +function onClick(evt) { + closeSecondaryToolbar.call(this, evt); + closeEditorUndoBar.call(this, evt); +} +function onKeyUp(evt) { + if (evt.key === "Control") { + this._isCtrlKeyDown = false; + } +} +function onKeyDown(evt) { + this._isCtrlKeyDown = evt.key === "Control"; + if (this.editorUndoBar?.isOpen && evt.keyCode !== 9 && evt.keyCode !== 16 && !((evt.keyCode === 13 || evt.keyCode === 32) && getActiveOrFocusedElement() === this.appConfig.editorUndoBar.undoButton)) { + this.editorUndoBar.hide(); + } + if (this.overlayManager.active) { + return; + } + const { + eventBus, + pdfViewer + } = this; + const isViewerInPresentationMode = pdfViewer.isInPresentationMode; + let handled = false, + ensureViewerFocused = false; + const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); + if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { + switch (evt.keyCode) { + case 70: + if (!this.supportsIntegratedFind && !evt.shiftKey) { + this.findBar?.open(); + handled = true; + } + break; + case 71: + if (!this.supportsIntegratedFind) { + const { + state + } = this.findController; + if (state) { + const newState = { + source: window, + type: "again", + findPrevious: cmd === 5 || cmd === 12 + }; + eventBus.dispatch("find", { + ...state, + ...newState + }); + } + handled = true; + } + break; + case 61: + case 107: + case 187: + case 171: + this.zoomIn(); + handled = true; + break; + case 173: + case 109: + case 189: + this.zoomOut(); + handled = true; + break; + case 48: + case 96: + if (!isViewerInPresentationMode) { + setTimeout(() => { + this.zoomReset(); + }); + handled = false; + } + break; + case 38: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 40: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + } + } + if (cmd === 1 || cmd === 8) { + switch (evt.keyCode) { + case 83: + eventBus.dispatch("download", { + source: window + }); + handled = true; + break; + case 79: + { + eventBus.dispatch("openfile", { + source: window + }); + handled = true; + } + break; + } + } + if (cmd === 3 || cmd === 10) { + switch (evt.keyCode) { + case 80: + this.requestPresentationMode(); + handled = true; + this.externalServices.reportTelemetry({ + type: "buttons", + data: { + id: "presentationModeKeyboard" + } + }); + break; + case 71: + if (this.appConfig.toolbar) { + this.appConfig.toolbar.pageNumber.select(); + handled = true; + } + break; + } + } + if (handled) { + if (ensureViewerFocused && !isViewerInPresentationMode) { + pdfViewer.focus(); + } + evt.preventDefault(); + return; + } + const curElement = getActiveOrFocusedElement(); + const curElementTagName = curElement?.tagName.toUpperCase(); + if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElementTagName === "BUTTON" && evt.keyCode === 32 || curElement?.isContentEditable) { + if (evt.keyCode !== 27) { + return; + } + } + if (cmd === 0) { + let turnPage = 0, + turnOnlyIfPageFit = false; + switch (evt.keyCode) { + case 38: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(true, false); + handled = true; + break; + } + case 33: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 8: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = -1; + break; + case 37: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 75: + case 80: + turnPage = -1; + break; + case 27: + if (this.secondaryToolbar?.isOpen) { + this.secondaryToolbar.close(); + handled = true; + } + if (!this.supportsIntegratedFind && this.findBar?.opened) { + this.findBar.close(); + handled = true; + } + break; + case 40: + if (this.supportsCaretBrowsingMode) { + this.moveCaret(false, false); + handled = true; + break; + } + case 34: + if (pdfViewer.isVerticalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 32: + if (!isViewerInPresentationMode) { + turnOnlyIfPageFit = true; + } + turnPage = 1; + break; + case 39: + if (this.supportsCaretBrowsingMode) { + return; + } + if (pdfViewer.isHorizontalScrollbarEnabled) { + turnOnlyIfPageFit = true; + } + case 74: + case 78: + turnPage = 1; + break; + case 36: + if (isViewerInPresentationMode || this.page > 1) { + this.page = 1; + handled = true; + ensureViewerFocused = true; + } + break; + case 35: + if (isViewerInPresentationMode || this.page < this.pagesCount) { + this.page = this.pagesCount; + handled = true; + ensureViewerFocused = true; + } + break; + case 83: + this.pdfCursorTools?.switchTool(CursorTool.SELECT); + break; + case 72: + this.pdfCursorTools?.switchTool(CursorTool.HAND); + break; + case 82: + this.rotatePages(90); + break; + case 115: + this.pdfSidebar?.toggle(); + break; + } + if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { + if (turnPage > 0) { + pdfViewer.nextPage(); + } else { + pdfViewer.previousPage(); + } + handled = true; + } + } + if (cmd === 4) { + switch (evt.keyCode) { + case 32: + if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { + break; + } + pdfViewer.previousPage(); + handled = true; + break; + case 38: + this.moveCaret(true, true); + handled = true; + break; + case 40: + this.moveCaret(false, true); + handled = true; + break; + case 82: + this.rotatePages(-90); + break; + } + } + if (!handled && !isViewerInPresentationMode) { + if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { + ensureViewerFocused = true; + } + } + if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { + pdfViewer.focus(); + } + if (handled) { + evt.preventDefault(); + } +} +function beforeUnload(evt) { + evt.preventDefault(); + evt.returnValue = ""; + return false; +} + +;// ./web/viewer.js + + + + +const AppConstants = { + LinkTarget: LinkTarget, + RenderingStates: RenderingStates, + ScrollMode: ScrollMode, + SpreadMode: SpreadMode +}; +window.PDFViewerApplication = PDFViewerApplication; +window.PDFViewerApplicationConstants = AppConstants; +window.PDFViewerApplicationOptions = AppOptions; +function getViewerConfiguration() { + return { + appContainer: document.body, + principalContainer: document.getElementById("mainContainer"), + mainContainer: document.getElementById("viewerContainer"), + viewerContainer: document.getElementById("viewer"), + viewerAlert: document.getElementById("viewer-alert"), + toolbar: { + container: document.getElementById("toolbarContainer"), + numPages: document.getElementById("numPages"), + pageNumber: document.getElementById("pageNumber"), + scaleSelect: document.getElementById("scaleSelect"), + customScaleOption: document.getElementById("customScaleOption"), + previous: document.getElementById("previous"), + next: document.getElementById("next"), + zoomIn: document.getElementById("zoomInButton"), + zoomOut: document.getElementById("zoomOutButton"), + print: document.getElementById("printButton"), + editorCommentButton: document.getElementById("editorCommentButton"), + editorCommentParamsToolbar: document.getElementById("editorCommentParamsToolbar"), + editorFreeTextButton: document.getElementById("editorFreeTextButton"), + editorFreeTextParamsToolbar: document.getElementById("editorFreeTextParamsToolbar"), + editorHighlightButton: document.getElementById("editorHighlightButton"), + editorHighlightParamsToolbar: document.getElementById("editorHighlightParamsToolbar"), + editorHighlightColorPicker: document.getElementById("editorHighlightColorPicker"), + editorInkButton: document.getElementById("editorInkButton"), + editorInkParamsToolbar: document.getElementById("editorInkParamsToolbar"), + editorStampButton: document.getElementById("editorStampButton"), + editorStampParamsToolbar: document.getElementById("editorStampParamsToolbar"), + editorSignatureButton: document.getElementById("editorSignatureButton"), + editorSignatureParamsToolbar: document.getElementById("editorSignatureParamsToolbar"), + download: document.getElementById("downloadButton") + }, + secondaryToolbar: { + toolbar: document.getElementById("secondaryToolbar"), + toggleButton: document.getElementById("secondaryToolbarToggleButton"), + presentationModeButton: document.getElementById("presentationMode"), + openFileButton: document.getElementById("secondaryOpenFile"), + printButton: document.getElementById("secondaryPrint"), + downloadButton: document.getElementById("secondaryDownload"), + viewBookmarkButton: document.getElementById("viewBookmark"), + firstPageButton: document.getElementById("firstPage"), + lastPageButton: document.getElementById("lastPage"), + pageRotateCwButton: document.getElementById("pageRotateCw"), + pageRotateCcwButton: document.getElementById("pageRotateCcw"), + cursorSelectToolButton: document.getElementById("cursorSelectTool"), + cursorHandToolButton: document.getElementById("cursorHandTool"), + scrollPageButton: document.getElementById("scrollPage"), + scrollVerticalButton: document.getElementById("scrollVertical"), + scrollHorizontalButton: document.getElementById("scrollHorizontal"), + scrollWrappedButton: document.getElementById("scrollWrapped"), + spreadNoneButton: document.getElementById("spreadNone"), + spreadOddButton: document.getElementById("spreadOdd"), + spreadEvenButton: document.getElementById("spreadEven"), + imageAltTextSettingsButton: document.getElementById("imageAltTextSettings"), + imageAltTextSettingsSeparator: document.getElementById("imageAltTextSettingsSeparator"), + documentPropertiesButton: document.getElementById("documentProperties") + }, + sidebar: { + outerContainer: document.getElementById("outerContainer"), + sidebarContainer: document.getElementById("sidebarContainer"), + toggleButton: document.getElementById("sidebarToggleButton"), + resizer: document.getElementById("sidebarResizer"), + thumbnailButton: document.getElementById("viewThumbnail"), + outlineButton: document.getElementById("viewOutline"), + attachmentsButton: document.getElementById("viewAttachments"), + layersButton: document.getElementById("viewLayers"), + thumbnailView: document.getElementById("thumbnailView"), + outlineView: document.getElementById("outlineView"), + attachmentsView: document.getElementById("attachmentsView"), + layersView: document.getElementById("layersView"), + currentOutlineItemButton: document.getElementById("currentOutlineItem") + }, + findBar: { + bar: document.getElementById("findbar"), + toggleButton: document.getElementById("viewFindButton"), + findField: document.getElementById("findInput"), + highlightAllCheckbox: document.getElementById("findHighlightAll"), + caseSensitiveCheckbox: document.getElementById("findMatchCase"), + matchDiacriticsCheckbox: document.getElementById("findMatchDiacritics"), + entireWordCheckbox: document.getElementById("findEntireWord"), + findMsg: document.getElementById("findMsg"), + findResultsCount: document.getElementById("findResultsCount"), + findPreviousButton: document.getElementById("findPreviousButton"), + findNextButton: document.getElementById("findNextButton") + }, + passwordOverlay: { + dialog: document.getElementById("passwordDialog"), + label: document.getElementById("passwordText"), + input: document.getElementById("password"), + submitButton: document.getElementById("passwordSubmit"), + cancelButton: document.getElementById("passwordCancel") + }, + documentProperties: { + dialog: document.getElementById("documentPropertiesDialog"), + closeButton: document.getElementById("documentPropertiesClose"), + fields: { + fileName: document.getElementById("fileNameField"), + fileSize: document.getElementById("fileSizeField"), + title: document.getElementById("titleField"), + author: document.getElementById("authorField"), + subject: document.getElementById("subjectField"), + keywords: document.getElementById("keywordsField"), + creationDate: document.getElementById("creationDateField"), + modificationDate: document.getElementById("modificationDateField"), + creator: document.getElementById("creatorField"), + producer: document.getElementById("producerField"), + version: document.getElementById("versionField"), + pageCount: document.getElementById("pageCountField"), + pageSize: document.getElementById("pageSizeField"), + linearized: document.getElementById("linearizedField") + } + }, + altTextDialog: { + dialog: document.getElementById("altTextDialog"), + optionDescription: document.getElementById("descriptionButton"), + optionDecorative: document.getElementById("decorativeButton"), + textarea: document.getElementById("descriptionTextarea"), + cancelButton: document.getElementById("altTextCancel"), + saveButton: document.getElementById("altTextSave") + }, + newAltTextDialog: { + dialog: document.getElementById("newAltTextDialog"), + title: document.getElementById("newAltTextTitle"), + descriptionContainer: document.getElementById("newAltTextDescriptionContainer"), + textarea: document.getElementById("newAltTextDescriptionTextarea"), + disclaimer: document.getElementById("newAltTextDisclaimer"), + learnMore: document.getElementById("newAltTextLearnMore"), + imagePreview: document.getElementById("newAltTextImagePreview"), + createAutomatically: document.getElementById("newAltTextCreateAutomatically"), + createAutomaticallyButton: document.getElementById("newAltTextCreateAutomaticallyButton"), + downloadModel: document.getElementById("newAltTextDownloadModel"), + downloadModelDescription: document.getElementById("newAltTextDownloadModelDescription"), + error: document.getElementById("newAltTextError"), + errorCloseButton: document.getElementById("newAltTextCloseButton"), + cancelButton: document.getElementById("newAltTextCancel"), + notNowButton: document.getElementById("newAltTextNotNow"), + saveButton: document.getElementById("newAltTextSave") + }, + altTextSettingsDialog: { + dialog: document.getElementById("altTextSettingsDialog"), + createModelButton: document.getElementById("createModelButton"), + aiModelSettings: document.getElementById("aiModelSettings"), + learnMore: document.getElementById("altTextSettingsLearnMore"), + deleteModelButton: document.getElementById("deleteModelButton"), + downloadModelButton: document.getElementById("downloadModelButton"), + showAltTextDialogButton: document.getElementById("showAltTextDialogButton"), + altTextSettingsCloseButton: document.getElementById("altTextSettingsCloseButton"), + closeButton: document.getElementById("altTextSettingsCloseButton") + }, + addSignatureDialog: { + dialog: document.getElementById("addSignatureDialog"), + panels: document.getElementById("addSignatureActionContainer"), + typeButton: document.getElementById("addSignatureTypeButton"), + typeInput: document.getElementById("addSignatureTypeInput"), + drawButton: document.getElementById("addSignatureDrawButton"), + drawSVG: document.getElementById("addSignatureDraw"), + drawPlaceholder: document.getElementById("addSignatureDrawPlaceholder"), + drawThickness: document.getElementById("addSignatureDrawThickness"), + imageButton: document.getElementById("addSignatureImageButton"), + imageSVG: document.getElementById("addSignatureImage"), + imagePlaceholder: document.getElementById("addSignatureImagePlaceholder"), + imagePicker: document.getElementById("addSignatureFilePicker"), + imagePickerLink: document.getElementById("addSignatureImageBrowse"), + description: document.getElementById("addSignatureDescription"), + clearButton: document.getElementById("clearSignatureButton"), + saveContainer: document.getElementById("addSignatureSaveContainer"), + saveCheckbox: document.getElementById("addSignatureSaveCheckbox"), + errorBar: document.getElementById("addSignatureError"), + errorTitle: document.getElementById("addSignatureErrorTitle"), + errorDescription: document.getElementById("addSignatureErrorDescription"), + errorCloseButton: document.getElementById("addSignatureErrorCloseButton"), + cancelButton: document.getElementById("addSignatureCancelButton"), + addButton: document.getElementById("addSignatureAddButton") + }, + editSignatureDialog: { + dialog: document.getElementById("editSignatureDescriptionDialog"), + description: document.getElementById("editSignatureDescription"), + editSignatureView: document.getElementById("editSignatureView"), + cancelButton: document.getElementById("editSignatureCancelButton"), + updateButton: document.getElementById("editSignatureUpdateButton") + }, + annotationEditorParams: { + editorCommentsSidebar: document.getElementById("editorCommentsSidebar"), + editorCommentsSidebarCount: document.getElementById("editorCommentsSidebarCount"), + editorCommentsSidebarTitle: document.getElementById("editorCommentsSidebarTitle"), + editorCommentsSidebarCloseButton: document.getElementById("editorCommentsSidebarCloseButton"), + editorCommentsSidebarList: document.getElementById("editorCommentsSidebarList"), + editorCommentsSidebarResizer: document.getElementById("editorCommentsSidebarResizer"), + editorFreeTextFontSize: document.getElementById("editorFreeTextFontSize"), + editorFreeTextColor: document.getElementById("editorFreeTextColor"), + editorInkColor: document.getElementById("editorInkColor"), + editorInkThickness: document.getElementById("editorInkThickness"), + editorInkOpacity: document.getElementById("editorInkOpacity"), + editorStampAddImage: document.getElementById("editorStampAddImage"), + editorSignatureAddSignature: document.getElementById("editorSignatureAddSignature"), + editorFreeHighlightThickness: document.getElementById("editorFreeHighlightThickness"), + editorHighlightShowAll: document.getElementById("editorHighlightShowAll") + }, + printContainer: document.getElementById("printContainer"), + editorUndoBar: { + container: document.getElementById("editorUndoBar"), + message: document.getElementById("editorUndoBarMessage"), + undoButton: document.getElementById("editorUndoBarUndoButton"), + closeButton: document.getElementById("editorUndoBarCloseButton") + }, + editCommentDialog: { + dialog: document.getElementById("commentManagerDialog"), + toolbar: document.getElementById("commentManagerToolbar"), + title: document.getElementById("commentManagerTitle"), + textInput: document.getElementById("commentManagerTextInput"), + cancelButton: document.getElementById("commentManagerCancelButton"), + saveButton: document.getElementById("commentManagerSaveButton") + } + }; +} +function webViewerLoad() { + const config = getViewerConfiguration(); + const event = new CustomEvent("webviewerloaded", { + bubbles: true, + cancelable: true, + detail: { + source: window + } + }); + try { + parent.document.dispatchEvent(event); + } catch (ex) { + console.error("webviewerloaded:", ex); + document.dispatchEvent(event); + } + PDFViewerApplication.run(config); +} +document.blockUnblockOnload?.(true); +if (document.readyState === "interactive" || document.readyState === "complete") { + webViewerLoad(); +} else { + document.addEventListener("DOMContentLoaded", webViewerLoad, true); +} + +export { PDFViewerApplication, AppConstants as PDFViewerApplicationConstants, AppOptions as PDFViewerApplicationOptions }; + +//# sourceMappingURL=viewer.mjs.map \ No newline at end of file diff --git a/frontend/static/pdfjs/web/viewer.mjs.map b/frontend/static/pdfjs/web/viewer.mjs.map new file mode 100644 index 0000000..5f8383b --- /dev/null +++ b/frontend/static/pdfjs/web/viewer.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"viewer.mjs","mappings":"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","sources":["webpack://pdf.js/webpack/bootstrap","webpack://pdf.js/webpack/runtime/define property getters","webpack://pdf.js/webpack/runtime/hasOwnProperty shorthand","webpack://pdf.js/./web/pdfjs.js","webpack://pdf.js/./web/ui_utils.js","webpack://pdf.js/./web/app_options.js","webpack://pdf.js/./web/pdf_link_service.js","webpack://pdf.js/./web/event_utils.js","webpack://pdf.js/./web/external_services.js","webpack://pdf.js/./web/preferences.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/types.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resolver.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/scope.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/builtins.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/memoizer.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/bundle.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/resource.js","webpack://pdf.js/./node_modules/@fluent/bundle/esm/index.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/overlay.js","webpack://pdf.js/./node_modules/cached-iterable/src/cached_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_sync_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/cached_async_iterable.mjs","webpack://pdf.js/./node_modules/cached-iterable/src/index.mjs","webpack://pdf.js/./node_modules/@fluent/dom/esm/localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/dom_localization.js","webpack://pdf.js/./node_modules/@fluent/dom/esm/index.js","webpack://pdf.js/./web/l10n.js","webpack://pdf.js/./web/genericl10n.js","webpack://pdf.js/./web/generic_scripting.js","webpack://pdf.js/./web/generic_signature_storage.js","webpack://pdf.js/./web/genericcom.js","webpack://pdf.js/./web/new_alt_text_manager.js","webpack://pdf.js/./web/alt_text_manager.js","webpack://pdf.js/./web/annotation_editor_params.js","webpack://pdf.js/./web/caret_browsing.js","webpack://pdf.js/./web/comment_manager.js","webpack://pdf.js/./web/download_manager.js","webpack://pdf.js/./web/editor_undo_bar.js","webpack://pdf.js/./web/overlay_manager.js","webpack://pdf.js/./web/password_prompt.js","webpack://pdf.js/./web/base_tree_viewer.js","webpack://pdf.js/./web/pdf_attachment_viewer.js","webpack://pdf.js/./web/grab_to_pan.js","webpack://pdf.js/./web/pdf_cursor_tools.js","webpack://pdf.js/./web/pdf_document_properties.js","webpack://pdf.js/./web/pdf_find_utils.js","webpack://pdf.js/./web/pdf_find_controller.js","webpack://pdf.js/./web/pdf_find_bar.js","webpack://pdf.js/./web/pdf_history.js","webpack://pdf.js/./web/pdf_layer_viewer.js","webpack://pdf.js/./web/pdf_outline_viewer.js","webpack://pdf.js/./web/pdf_presentation_mode.js","webpack://pdf.js/./web/xfa_layer_builder.js","webpack://pdf.js/./web/print_utils.js","webpack://pdf.js/./web/pdf_print_service.js","webpack://pdf.js/./web/pdf_rendering_queue.js","webpack://pdf.js/./web/pdf_scripting_manager.js","webpack://pdf.js/./web/pdf_sidebar.js","webpack://pdf.js/./web/pdf_thumbnail_view.js","webpack://pdf.js/./web/pdf_thumbnail_viewer.js","webpack://pdf.js/./web/annotation_editor_layer_builder.js","webpack://pdf.js/./web/annotation_layer_builder.js","webpack://pdf.js/./web/autolinker.js","webpack://pdf.js/./web/base_pdf_page_view.js","webpack://pdf.js/./web/draw_layer_builder.js","webpack://pdf.js/./web/pdf_page_detail_view.js","webpack://pdf.js/./web/struct_tree_layer_builder.js","webpack://pdf.js/./web/text_accessibility.js","webpack://pdf.js/./web/text_highlighter.js","webpack://pdf.js/./web/text_layer_builder.js","webpack://pdf.js/./web/pdf_page_view.js","webpack://pdf.js/./web/pdf_viewer.js","webpack://pdf.js/./web/secondary_toolbar.js","webpack://pdf.js/./web/signature_manager.js","webpack://pdf.js/./web/toolbar.js","webpack://pdf.js/./web/view_history.js","webpack://pdf.js/./web/app.js","webpack://pdf.js/./web/viewer.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* Copyright 2016 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\nconst {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n AnnotationType,\n applyOpacity,\n build,\n ColorPicker,\n createValidAbsoluteUrl,\n CSSConstants,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n findContrastColor,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getRGB,\n getUuid,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n isValidExplicitDest,\n MathClamp,\n noContextMenu,\n normalizeUnicode,\n OPS,\n OutputScale,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n renderRichText,\n ResponseException,\n setLayerDimensions,\n shadow,\n SignatureExtractor,\n stopEvent,\n SupportedImageMimeTypes,\n TextLayer,\n TouchManager,\n updateUrlHash,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\n} = globalThis.pdfjsLib;\n\nexport {\n AbortException,\n AnnotationEditorLayer,\n AnnotationEditorParamsType,\n AnnotationEditorType,\n AnnotationEditorUIManager,\n AnnotationLayer,\n AnnotationMode,\n AnnotationType,\n applyOpacity,\n build,\n ColorPicker,\n createValidAbsoluteUrl,\n CSSConstants,\n DOMSVGFactory,\n DrawLayer,\n FeatureTest,\n fetchData,\n findContrastColor,\n getDocument,\n getFilenameFromUrl,\n getPdfFilenameFromUrl,\n getRGB,\n getUuid,\n getXfaPageViewport,\n GlobalWorkerOptions,\n ImageKind,\n InvalidPDFException,\n isDataScheme,\n isPdfFile,\n isValidExplicitDest,\n MathClamp,\n noContextMenu,\n normalizeUnicode,\n OPS,\n OutputScale,\n PasswordResponses,\n PDFDataRangeTransport,\n PDFDateString,\n PDFWorker,\n PermissionFlag,\n PixelsPerInch,\n RenderingCancelledException,\n renderRichText,\n ResponseException,\n setLayerDimensions,\n shadow,\n SignatureExtractor,\n stopEvent,\n SupportedImageMimeTypes,\n TextLayer,\n TouchManager,\n updateUrlHash,\n Util,\n VerbosityLevel,\n version,\n XfaLayer,\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\nimport { MathClamp } from \"pdfjs-lib\";\n\nconst DEFAULT_SCALE_VALUE = \"auto\";\nconst DEFAULT_SCALE = 1.0;\nconst DEFAULT_SCALE_DELTA = 1.1;\nconst MIN_SCALE = 0.1;\nconst MAX_SCALE = 10.0;\nconst UNKNOWN_SCALE = 0;\nconst MAX_AUTO_SCALE = 1.25;\nconst SCROLLBAR_PADDING = 40;\nconst VERTICAL_PADDING = 5;\n\nconst RenderingStates = {\n INITIAL: 0,\n RUNNING: 1,\n PAUSED: 2,\n FINISHED: 3,\n};\n\nconst PresentationModeState = {\n UNKNOWN: 0,\n NORMAL: 1,\n CHANGING: 2,\n FULLSCREEN: 3,\n};\n\nconst SidebarView = {\n UNKNOWN: -1,\n NONE: 0,\n THUMBS: 1, // Default value.\n OUTLINE: 2,\n ATTACHMENTS: 3,\n LAYERS: 4,\n};\n\nconst TextLayerMode = {\n DISABLE: 0,\n ENABLE: 1,\n ENABLE_PERMISSIONS: 2,\n};\n\nconst ScrollMode = {\n UNKNOWN: -1,\n VERTICAL: 0, // Default value.\n HORIZONTAL: 1,\n WRAPPED: 2,\n PAGE: 3,\n};\n\nconst SpreadMode = {\n UNKNOWN: -1,\n NONE: 0, // Default value.\n ODD: 1,\n EVEN: 2,\n};\n\nconst CursorTool = {\n SELECT: 0, // The default value.\n HAND: 1,\n ZOOM: 2,\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nconst AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {HTMLElement} element - The element to be visible.\n * @param {Object} [spot] - An object with optional top and left properties,\n * specifying the offset from the top left edge.\n * @param {number} [spot.left]\n * @param {number} [spot.top]\n * @param {boolean} [scrollMatches] - When scrolling search results into view,\n * ignore elements that either: Contains marked content identifiers,\n * or have the CSS-rule `overflow: hidden;` set. The default value is `false`.\n */\nfunction scrollIntoView(element, spot, scrollMatches = false) {\n // Assuming offsetParent is available (it's not available when viewer is in\n // hidden iframe or object). We have to scroll: if the offsetParent is not set\n // producing the error. See also animationStarted.\n let parent = element.offsetParent;\n if (!parent) {\n console.error(\"offsetParent is not set -- cannot scroll\");\n return;\n }\n let offsetY = element.offsetTop + element.clientTop;\n let offsetX = element.offsetLeft + element.clientLeft;\n while (\n (parent.clientHeight === parent.scrollHeight &&\n parent.clientWidth === parent.scrollWidth) ||\n (scrollMatches &&\n (parent.classList.contains(\"markedContent\") ||\n getComputedStyle(parent).overflow === \"hidden\"))\n ) {\n offsetY += parent.offsetTop;\n offsetX += parent.offsetLeft;\n\n parent = parent.offsetParent;\n if (!parent) {\n return; // no need to scroll\n }\n }\n if (spot) {\n if (spot.top !== undefined) {\n offsetY += spot.top;\n }\n if (spot.left !== undefined) {\n if (scrollMatches) {\n const elementWidth = element.getBoundingClientRect().width;\n const padding = MathClamp(\n (parent.clientWidth - elementWidth) / 2,\n 20,\n 400\n );\n offsetX += spot.left - padding;\n } else {\n offsetX += spot.left;\n }\n parent.scrollLeft = offsetX;\n }\n }\n parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback, abortSignal = undefined) {\n const debounceScroll = function (evt) {\n if (rAF) {\n return;\n }\n // schedule an invocation of scroll for next animation frame.\n rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n rAF = null;\n\n const currentX = viewAreaElement.scrollLeft;\n const lastX = state.lastX;\n if (currentX !== lastX) {\n state.right = currentX > lastX;\n }\n state.lastX = currentX;\n const currentY = viewAreaElement.scrollTop;\n const lastY = state.lastY;\n if (currentY !== lastY) {\n state.down = currentY > lastY;\n }\n state.lastY = currentY;\n callback(state);\n });\n };\n\n const state = {\n right: true,\n down: true,\n lastX: viewAreaElement.scrollLeft,\n lastY: viewAreaElement.scrollTop,\n _eventHandler: debounceScroll,\n };\n\n let rAF = null;\n viewAreaElement.addEventListener(\"scroll\", debounceScroll, {\n useCapture: true,\n signal: abortSignal,\n });\n abortSignal?.addEventListener(\n \"abort\",\n () => window.cancelAnimationFrame(rAF),\n { once: true }\n );\n return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value¶m2=...).\n * @param {string} query\n * @returns {Map}\n */\nfunction parseQueryString(query) {\n const params = new Map();\n for (const [key, value] of new URLSearchParams(query)) {\n params.set(key.toLowerCase(), value);\n }\n return params;\n}\n\nconst InvisibleCharsRegExp = /[\\x00-\\x1F]/g;\n\n/**\n * @param {string} str\n * @param {boolean} [replaceInvisible]\n */\nfunction removeNullCharacters(str, replaceInvisible = false) {\n if (!InvisibleCharsRegExp.test(str)) {\n return str;\n }\n if (replaceInvisible) {\n return str.replaceAll(InvisibleCharsRegExp, m => (m === \"\\x00\" ? \"\" : \" \"));\n }\n return str.replaceAll(\"\\x00\", \"\");\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n * or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition, start = 0) {\n let minIndex = start;\n let maxIndex = items.length - 1;\n\n if (maxIndex < 0 || !condition(items[maxIndex])) {\n return items.length;\n }\n if (condition(items[minIndex])) {\n return minIndex;\n }\n\n while (minIndex < maxIndex) {\n const currentIndex = (minIndex + maxIndex) >> 1;\n const currentItem = items[currentIndex];\n if (condition(currentItem)) {\n maxIndex = currentIndex;\n } else {\n minIndex = currentIndex + 1;\n }\n }\n return minIndex; /* === maxIndex */\n}\n\n/**\n * Approximates float number as a fraction using Farey sequence (max order\n * of 8).\n * @param {number} x - Positive float number.\n * @returns {Array} Estimated fraction: the first array item is a numerator,\n * the second one is a denominator.\n * They are both natural numbers.\n */\nfunction approximateFraction(x) {\n // Fast paths for int numbers or their inversions.\n if (Math.floor(x) === x) {\n return [x, 1];\n }\n const xinv = 1 / x;\n const limit = 8;\n if (xinv > limit) {\n return [1, limit];\n } else if (Math.floor(xinv) === xinv) {\n return [1, xinv];\n }\n\n const x_ = x > 1 ? xinv : x;\n // a/b and c/d are neighbours in Farey sequence.\n let a = 0,\n b = 1,\n c = 1,\n d = 1;\n // Limiting search to order 8.\n while (true) {\n // Generating next term in sequence (order of q).\n const p = a + c,\n q = b + d;\n if (q > limit) {\n break;\n }\n if (x_ <= p / q) {\n c = p;\n d = q;\n } else {\n a = p;\n b = q;\n }\n }\n let result;\n // Select closest of the neighbours to x.\n if (x_ - a / b < c / d - x_) {\n result = x_ === x ? [a, b] : [b, a];\n } else {\n result = x_ === x ? [c, d] : [d, c];\n }\n return result;\n}\n\n/**\n * @param {number} x - A positive number to round to a multiple of `div`.\n * @param {number} div - A natural number.\n */\nfunction floorToDivide(x, div) {\n return x - (x % div);\n}\n\n/**\n * @typedef {Object} GetPageSizeInchesParameters\n * @property {number[]} view\n * @property {number} userUnit\n * @property {number} rotate\n */\n\n/**\n * @typedef {Object} PageSize\n * @property {number} width - In inches.\n * @property {number} height - In inches.\n */\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {GetPageSizeInchesParameters} params\n * @returns {PageSize}\n */\nfunction getPageSizeInches({ view, userUnit, rotate }) {\n const [x1, y1, x2, y2] = view;\n // We need to take the page rotation into account as well.\n const changeOrientation = rotate % 180 !== 0;\n\n const width = ((x2 - x1) / 72) * userUnit;\n const height = ((y2 - y1) / 72) * userUnit;\n\n return {\n width: changeOrientation ? height : width,\n height: changeOrientation ? width : height,\n };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n * before the first visible element in `views`, but not by too much. (Usually,\n * this will be the first element in the first partially visible row in\n * `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n // binarySearchFirstItem's assumption is that the input is ordered, with only\n // one index where the conditions flips from false to true: [false ...,\n // true...]. With vertical scrolling and spreads, it is possible to have\n // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n // similar sequence, with many more mixed true and false in the middle.\n //\n // So there is no guarantee that the binary search yields the index of the\n // first visible element. It could have been any of the other visible elements\n // that were preceded by a hidden element.\n\n // Of course, if either this element or the previous (hidden) element is also\n // the first element, there's nothing to worry about.\n if (index < 2) {\n return index;\n }\n\n // That aside, the possible cases are represented below.\n //\n // **** = fully hidden\n // A*B* = mix of partially visible and/or hidden pages\n // CDEF = fully visible\n //\n // (1) Binary search could have returned A, in which case we can stop.\n // (2) Binary search could also have returned B, in which case we need to\n // check the whole row.\n // (3) Binary search could also have returned C, in which case we need to\n // check the whole previous row.\n //\n // There's one other possibility:\n //\n // **** = fully hidden\n // ABCD = mix of fully and/or partially visible pages\n //\n // (4) Binary search could only have returned A.\n\n // Initially assume that we need to find the beginning of the current row\n // (case 1, 2, or 4), which means finding a page that is above the current\n // page's top. If the found page is partially visible, we're definitely not in\n // case 3, and this assumption is correct.\n let elt = views[index].div;\n let pageTop = elt.offsetTop + elt.clientTop;\n\n if (pageTop >= top) {\n // The found page is fully visible, so we're actually either in case 3 or 4,\n // and unfortunately we can't tell the difference between them without\n // scanning the entire previous row, so we just conservatively assume that\n // we do need to backtrack to that row. In both cases, the previous page is\n // in the previous row, so use its top instead.\n elt = views[index - 1].div;\n pageTop = elt.offsetTop + elt.clientTop;\n }\n\n // Now we backtrack to the first page that still has its bottom below\n // `pageTop`, which is the top of a page in the first visible row (unless\n // we're in case 4, in which case it's the row before that).\n // `index` is found by binary search, so the page at `index - 1` is\n // invisible and we can start looking for potentially visible pages from\n // `index - 2`. (However, if this loop terminates on its first iteration,\n // which is the case when pages are stacked vertically, `index` should remain\n // unchanged, so we use a distinct loop variable.)\n for (let i = index - 2; i >= 0; --i) {\n elt = views[i].div;\n if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n // We have reached the previous row, so stop now.\n // This loop is expected to terminate relatively quickly because the\n // number of pages per row is expected to be small.\n break;\n }\n index = i;\n }\n return index;\n}\n\n/**\n * @typedef {Object} GetVisibleElementsParameters\n * @property {HTMLElement} scrollEl - A container that can possibly scroll.\n * @property {Array} views - Objects with a `div` property that contains an\n * HTMLElement, which should all be descendants of `scrollEl` satisfying the\n * relevant layout assumptions.\n * @property {boolean} sortByVisibility - If `true`, the returned elements are\n * sorted in descending order of the percent of their padding box that is\n * visible. The default value is `false`.\n * @property {boolean} horizontal - If `true`, the elements are assumed to be\n * laid out horizontally instead of vertically. The default value is `false`.\n * @property {boolean} rtl - If `true`, the `scrollEl` container is assumed to\n * be in right-to-left mode. The default value is `false`.\n */\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n * - If `horizontal`, no left of any earlier element is to the right of the\n * left of any later element.\n * - Otherwise, `views` can be split into contiguous rows where, within a row,\n * no top of any element is below the bottom of any other element, and\n * between rows, no bottom of any element in an earlier row is below the\n * top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param {GetVisibleElementsParameters} params\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements({\n scrollEl,\n views,\n sortByVisibility = false,\n horizontal = false,\n rtl = false,\n}) {\n const top = scrollEl.scrollTop,\n bottom = top + scrollEl.clientHeight;\n const left = scrollEl.scrollLeft,\n right = left + scrollEl.clientWidth;\n\n // Throughout this \"generic\" function, comments will assume we're working with\n // PDF document pages, which is the most important and complex case. In this\n // case, the visible elements we're actually interested is the page canvas,\n // which is contained in a wrapper which adds no padding/border/margin, which\n // is itself contained in `view.div` which adds no padding (but does add a\n // border). So, as specified in this function's doc comment, this function\n // does all of its work on the padding edge of the provided views, starting at\n // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n // the border). Adding clientWidth/Height gets us the bottom-right corner of\n // the padding edge.\n function isElementBottomAfterViewTop(view) {\n const element = view.div;\n const elementBottom =\n element.offsetTop + element.clientTop + element.clientHeight;\n return elementBottom > top;\n }\n function isElementNextAfterViewHorizontally(view) {\n const element = view.div;\n const elementLeft = element.offsetLeft + element.clientLeft;\n const elementRight = elementLeft + element.clientWidth;\n return rtl ? elementLeft < right : elementRight > left;\n }\n\n const visible = [],\n ids = new Set(),\n numViews = views.length;\n let firstVisibleElementInd = binarySearchFirstItem(\n views,\n horizontal\n ? isElementNextAfterViewHorizontally\n : isElementBottomAfterViewTop\n );\n\n // Please note the return value of the `binarySearchFirstItem` function when\n // no valid element is found (hence the `firstVisibleElementInd` check below).\n if (\n firstVisibleElementInd > 0 &&\n firstVisibleElementInd < numViews &&\n !horizontal\n ) {\n // In wrapped scrolling (or vertical scrolling with spreads), with some page\n // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n // condition: there can be pages with bottoms above the view top between\n // pages with bottoms below. This function detects and corrects that error;\n // see it for more comments.\n firstVisibleElementInd = backtrackBeforeAllVisibleElements(\n firstVisibleElementInd,\n views,\n top\n );\n }\n\n // lastEdge acts as a cutoff for us to stop looping, because we know all\n // subsequent pages will be hidden.\n //\n // When using wrapped scrolling or vertical scrolling with spreads, we can't\n // simply stop the first time we reach a page below the bottom of the view;\n // the tops of subsequent pages on the same row could still be visible. In\n // horizontal scrolling, we don't have that issue, so we can stop as soon as\n // we pass `right`, without needing the code below that handles the -1 case.\n let lastEdge = horizontal ? right : -1;\n\n for (let i = firstVisibleElementInd; i < numViews; i++) {\n const view = views[i],\n element = view.div;\n const currentWidth = element.offsetLeft + element.clientLeft;\n const currentHeight = element.offsetTop + element.clientTop;\n const viewWidth = element.clientWidth,\n viewHeight = element.clientHeight;\n const viewRight = currentWidth + viewWidth;\n const viewBottom = currentHeight + viewHeight;\n\n if (lastEdge === -1) {\n // As commented above, this is only needed in non-horizontal cases.\n // Setting lastEdge to the bottom of the first page that is partially\n // visible ensures that the next page fully below lastEdge is on the\n // next row, which has to be fully hidden along with all subsequent rows.\n if (viewBottom >= bottom) {\n lastEdge = viewBottom;\n }\n } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n break;\n }\n\n if (\n viewBottom <= top ||\n currentHeight >= bottom ||\n viewRight <= left ||\n currentWidth >= right\n ) {\n continue;\n }\n\n const minY = Math.max(0, top - currentHeight);\n const minX = Math.max(0, left - currentWidth);\n\n const hiddenHeight = minY + Math.max(0, viewBottom - bottom);\n const hiddenWidth = minX + Math.max(0, viewRight - right);\n\n const fractionHeight = (viewHeight - hiddenHeight) / viewHeight,\n fractionWidth = (viewWidth - hiddenWidth) / viewWidth;\n const percent = (fractionHeight * fractionWidth * 100) | 0;\n\n visible.push({\n id: view.id,\n x: currentWidth,\n y: currentHeight,\n visibleArea:\n // We only specify which part of the page is visible when it's not\n // the full page, as there is no point in handling a partial page\n // rendering otherwise.\n percent === 100\n ? null\n : {\n minX,\n minY,\n maxX: Math.min(viewRight, right) - currentWidth,\n maxY: Math.min(viewBottom, bottom) - currentHeight,\n },\n view,\n percent,\n widthPercent: (fractionWidth * 100) | 0,\n });\n ids.add(view.id);\n }\n\n const first = visible[0],\n last = visible.at(-1);\n\n if (sortByVisibility) {\n visible.sort(function (a, b) {\n const pc = a.percent - b.percent;\n if (Math.abs(pc) > 0.001) {\n return -pc;\n }\n return a.id - b.id; // ensure stability\n });\n }\n return { first, last, views: visible, ids };\n}\n\nfunction normalizeWheelEventDirection(evt) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY);\n const angle = Math.atan2(evt.deltaY, evt.deltaX);\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n // All that is left-up oriented has to change the sign.\n delta = -delta;\n }\n return delta;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n const deltaMode = evt.deltaMode; // Avoid being affected by bug 1392460.\n let delta = normalizeWheelEventDirection(evt);\n\n const MOUSE_PIXELS_PER_LINE = 30;\n const MOUSE_LINES_PER_PAGE = 30;\n\n // Converts delta to per-page units\n if (deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n } else if (deltaMode === WheelEvent.DOM_DELTA_LINE) {\n delta /= MOUSE_LINES_PER_PAGE;\n }\n return delta;\n}\n\nfunction isValidRotation(angle) {\n return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(ScrollMode).includes(mode) &&\n mode !== ScrollMode.UNKNOWN\n );\n}\n\nfunction isValidSpreadMode(mode) {\n return (\n Number.isInteger(mode) &&\n Object.values(SpreadMode).includes(mode) &&\n mode !== SpreadMode.UNKNOWN\n );\n}\n\nfunction isPortraitOrientation(size) {\n return size.width <= size.height;\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nconst animationStarted = new Promise(function (resolve) {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof window === \"undefined\"\n ) {\n // Prevent \"ReferenceError: window is not defined\" errors when running the\n // unit-tests in Node.js environments.\n setTimeout(resolve, 20);\n return;\n }\n window.requestAnimationFrame(resolve);\n});\n\nconst docStyle =\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ? null\n : document.documentElement.style;\n\nclass ProgressBar {\n #classList = null;\n\n #disableAutoFetchTimeout = null;\n\n #percent = 0;\n\n #style = null;\n\n #visible = true;\n\n constructor(bar) {\n this.#classList = bar.classList;\n this.#style = bar.style;\n }\n\n get percent() {\n return this.#percent;\n }\n\n set percent(val) {\n this.#percent = MathClamp(val, 0, 100);\n\n if (isNaN(val)) {\n this.#classList.add(\"indeterminate\");\n return;\n }\n this.#classList.remove(\"indeterminate\");\n\n this.#style.setProperty(\"--progressBar-percent\", `${this.#percent}%`);\n }\n\n setWidth(viewer) {\n if (!viewer) {\n return;\n }\n const container = viewer.parentNode;\n const scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n if (scrollbarWidth > 0) {\n this.#style.setProperty(\n \"--progressBar-end-offset\",\n `${scrollbarWidth}px`\n );\n }\n }\n\n setDisableAutoFetch(delay = /* ms = */ 5000) {\n if (this.#percent === 100 || isNaN(this.#percent)) {\n return;\n }\n if (this.#disableAutoFetchTimeout) {\n clearTimeout(this.#disableAutoFetchTimeout);\n }\n this.show();\n\n this.#disableAutoFetchTimeout = setTimeout(() => {\n this.#disableAutoFetchTimeout = null;\n this.hide();\n }, delay);\n }\n\n hide() {\n if (!this.#visible) {\n return;\n }\n this.#visible = false;\n this.#classList.add(\"hidden\");\n }\n\n show() {\n if (this.#visible) {\n return;\n }\n this.#visible = true;\n this.#classList.remove(\"hidden\");\n }\n}\n\n/**\n * Get the active or focused element in current DOM.\n *\n * Recursively search for the truly active or focused element in case there are\n * shadow DOMs.\n *\n * @returns {Element} the truly active or focused element.\n */\nfunction getActiveOrFocusedElement() {\n let curRoot = document;\n let curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n\n while (curActiveOrFocused?.shadowRoot) {\n curRoot = curActiveOrFocused.shadowRoot;\n curActiveOrFocused =\n curRoot.activeElement || curRoot.querySelector(\":focus\");\n }\n\n return curActiveOrFocused;\n}\n\n/**\n * Converts API PageLayout values to the format used by `BaseViewer`.\n * @param {string} layout - The API PageLayout value.\n * @returns {Object}\n */\nfunction apiPageLayoutToViewerModes(layout) {\n let scrollMode = ScrollMode.VERTICAL,\n spreadMode = SpreadMode.NONE;\n\n switch (layout) {\n case \"SinglePage\":\n scrollMode = ScrollMode.PAGE;\n break;\n case \"OneColumn\":\n break;\n case \"TwoPageLeft\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnLeft\":\n spreadMode = SpreadMode.ODD;\n break;\n case \"TwoPageRight\":\n scrollMode = ScrollMode.PAGE;\n /* falls through */\n case \"TwoColumnRight\":\n spreadMode = SpreadMode.EVEN;\n break;\n }\n return { scrollMode, spreadMode };\n}\n\n/**\n * Converts API PageMode values to the format used by `PDFSidebar`.\n * NOTE: There's also a \"FullScreen\" parameter which is not possible to support,\n * since the Fullscreen API used in browsers requires that entering\n * fullscreen mode only occurs as a result of a user-initiated event.\n * @param {string} mode - The API PageMode value.\n * @returns {number} A value from {SidebarView}.\n */\nfunction apiPageModeToSidebarView(mode) {\n switch (mode) {\n case \"UseNone\":\n return SidebarView.NONE;\n case \"UseThumbs\":\n return SidebarView.THUMBS;\n case \"UseOutlines\":\n return SidebarView.OUTLINE;\n case \"UseAttachments\":\n return SidebarView.ATTACHMENTS;\n case \"UseOC\":\n return SidebarView.LAYERS;\n }\n return SidebarView.NONE; // Default value.\n}\n\nfunction toggleCheckedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-checked\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\nfunction toggleExpandedBtn(button, toggle, view = null) {\n button.classList.toggle(\"toggled\", toggle);\n button.setAttribute(\"aria-expanded\", toggle);\n\n view?.classList.toggle(\"hidden\", !toggle);\n}\n\n// In Firefox, the css calc function uses f32 precision but the Chrome or Safari\n// are using f64 one. So in order to have the same rendering in all browsers, we\n// need to use the right precision in order to have correct dimensions.\nconst calcRound =\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? Math.fround\n : (function () {\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n typeof document === \"undefined\"\n ) {\n return x => x;\n }\n const e = document.createElement(\"div\");\n e.style.width = \"round(down, calc(1.6666666666666665 * 792px), 1px)\";\n return e.style.width === \"calc(1320px)\" ? Math.fround : x => x;\n })();\n\nexport {\n animationStarted,\n apiPageLayoutToViewerModes,\n apiPageModeToSidebarView,\n approximateFraction,\n AutoPrintRegExp,\n backtrackBeforeAllVisibleElements, // only exported for testing\n binarySearchFirstItem,\n calcRound,\n CursorTool,\n DEFAULT_SCALE,\n DEFAULT_SCALE_DELTA,\n DEFAULT_SCALE_VALUE,\n docStyle,\n floorToDivide,\n getActiveOrFocusedElement,\n getPageSizeInches,\n getVisibleElements,\n isPortraitOrientation,\n isValidRotation,\n isValidScrollMode,\n isValidSpreadMode,\n MAX_AUTO_SCALE,\n MAX_SCALE,\n MIN_SCALE,\n normalizeWheelEventDelta,\n normalizeWheelEventDirection,\n parseQueryString,\n PresentationModeState,\n ProgressBar,\n removeNullCharacters,\n RenderingStates,\n SCROLLBAR_PADDING,\n scrollIntoView,\n ScrollMode,\n SidebarView,\n SpreadMode,\n TextLayerMode,\n toggleCheckedBtn,\n toggleExpandedBtn,\n UNKNOWN_SCALE,\n VERTICAL_PADDING,\n watchScroll,\n};\n","/* Copyright 2018 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\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // eslint-disable-next-line no-var\n var compatParams = new Map();\n if (\n typeof PDFJSDev !== \"undefined\" &&\n PDFJSDev.test(\"LIB\") &&\n !globalThis.navigator?.language\n ) {\n globalThis.navigator = {\n language: \"en-US\",\n maxTouchPoints: 1,\n platform: \"\",\n userAgent: \"\",\n };\n }\n const { maxTouchPoints, platform, userAgent } = navigator;\n\n const isAndroid = /Android/.test(userAgent);\n const isIOS =\n /\\b(iPad|iPhone|iPod)(?=;)/.test(userAgent) ||\n (platform === \"MacIntel\" && maxTouchPoints > 1);\n\n // Limit canvas size to 5 mega-pixels on mobile.\n // Support: Android, iOS\n (function () {\n if (isIOS || isAndroid) {\n compatParams.set(\"maxCanvasPixels\", 5242880);\n }\n })();\n\n // Don't use system fonts on Android (issue 18210).\n // Support: Android\n (function () {\n if (isAndroid) {\n compatParams.set(\"useSystemFonts\", false);\n }\n })();\n}\n\nconst OptionKind = {\n BROWSER: 0x01,\n VIEWER: 0x02,\n API: 0x04,\n WORKER: 0x08,\n EVENT_DISPATCH: 0x10,\n PREFERENCE: 0x80,\n};\n\n// Should only be used with options that allow multiple types.\nconst Type = {\n BOOLEAN: 0x01,\n NUMBER: 0x02,\n OBJECT: 0x04,\n STRING: 0x08,\n UNDEFINED: 0x10,\n};\n\n/**\n * NOTE: These options are used to generate the `default_preferences.json` file,\n * see `OptionKind.PREFERENCE`, hence the values below must use only\n * primitive types and cannot rely on any imported types.\n */\nconst defaultOptions = {\n allowedGlobalEvents: {\n /** @type {Object} */\n value: null,\n kind: OptionKind.BROWSER,\n },\n canvasMaxAreaInBytes: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.BROWSER + OptionKind.API,\n },\n isInAutomation: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n localeProperties: {\n /** @type {Object} */\n value:\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")\n ? { lang: navigator.language || \"en-US\" }\n : null,\n kind: OptionKind.BROWSER,\n },\n maxCanvasDim: {\n /** @type {number} */\n value: 32767,\n kind: OptionKind.BROWSER + OptionKind.VIEWER,\n },\n nimbusDataStr: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.BROWSER,\n },\n supportsCaretBrowsingMode: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsDocumentFonts: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsIntegratedFind: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomCtrlKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsMouseWheelZoomMetaKey: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsPinchToZoom: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n supportsPrinting: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.BROWSER,\n },\n toolbarDensity: {\n /** @type {number} */\n value: 0, // 0 = \"normal\", 1 = \"compact\", 2 = \"touch\"\n kind: OptionKind.BROWSER + OptionKind.EVENT_DISPATCH,\n },\n\n altTextLearnMoreUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/pdf-alt-text\"\n : \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n annotationEditorMode: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n annotationMode: {\n /** @type {number} */\n value: 2,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n capCanvasAreaFactor: {\n /** @type {number} */\n value: 200,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n commentLearnMoreUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"MOZCENTRAL\")\n ? \"https://support.mozilla.org/%LOCALE%/kb/view-pdf-files-firefox-or-choose-another-viewer#w_add-a-comment-to-a-pdf\"\n : \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n cursorToolOnLoad: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n debuggerSrc: {\n /** @type {string} */\n value: \"./debugger.mjs\",\n kind: OptionKind.VIEWER,\n },\n defaultZoomDelay: {\n /** @type {number} */\n value: 400,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n defaultZoomValue: {\n /** @type {string} */\n value: \"\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n disableHistory: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER,\n },\n disablePageLabels: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableAltText: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableAltTextModelDownload: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n },\n enableAutoLinking: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableComment: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableDetailCanvas: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER,\n },\n enableGuessAltText: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE + OptionKind.EVENT_DISPATCH,\n },\n enableHighlightFloatingButton: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableNewAltTextWhenAddingImage: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableOptimizedPartialRendering: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePermissions: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enablePrintAutoRotate: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableScripting: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"CHROME\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableSignatureEditor: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableUpdatedAddImage: {\n // We'll probably want to make some experiments before enabling this\n // in Firefox release, but it has to be temporary.\n // TODO: remove it when unnecessary.\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n externalLinkRel: {\n /** @type {string} */\n value: \"noopener noreferrer nofollow\",\n kind: OptionKind.VIEWER,\n },\n externalLinkTarget: {\n /** @type {number} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n highlightEditorColors: {\n /** @type {string} */\n value:\n \"yellow=#FFFF98,green=#53FFBC,blue=#80EBFF,pink=#FFCBE6,red=#FF4F5F,\" +\n \"yellow_HCM=#FFFFCC,green_HCM=#53FFBC,blue_HCM=#80EBFF,pink_HCM=#F6B8FF,red_HCM=#C50043\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n historyUpdateUrl: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n ignoreDestinationZoom: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n imageResourcesPath: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/images/\"\n : \"./images/\",\n kind: OptionKind.VIEWER,\n },\n maxCanvasPixels: {\n /** @type {number} */\n value: 2 ** 25,\n kind: OptionKind.VIEWER,\n },\n minDurationToUpdateCanvas: {\n /** @type {number} */\n value: 500, // ms\n kind: OptionKind.VIEWER,\n },\n forcePageColors: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsBackground: {\n /** @type {string} */\n value: \"Canvas\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pageColorsForeground: {\n /** @type {string} */\n value: \"CanvasText\",\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n pdfBugEnabled: {\n /** @type {boolean} */\n value: typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n printResolution: {\n /** @type {number} */\n value: 150,\n kind: OptionKind.VIEWER,\n },\n sidebarViewOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n scrollModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n spreadModeOnLoad: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n textLayerMode: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewerCssTheme: {\n /** @type {number} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\") ? 2 : 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n viewOnLoad: {\n /** @type {boolean} */\n value: 0,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n\n cMapPacked: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n cMapUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/bcmaps/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/cmaps/\"\n : \"../web/cmaps/\",\n kind: OptionKind.API,\n },\n disableAutoFetch: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableFontFace: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableRange: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n disableStream: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n docBaseUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\"\n ? // NOTE: We cannot use the `updateUrlHash` function here, because of\n // the default preferences generation (see `gulpfile.mjs`).\n // However, the following line is *only* used in development mode.\n document.URL.split(\"#\", 1)[0]\n : \"\",\n kind: OptionKind.API,\n },\n enableHWA: {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\"),\n kind: OptionKind.API + OptionKind.VIEWER + OptionKind.PREFERENCE,\n },\n enableXfa: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API + OptionKind.PREFERENCE,\n },\n fontExtraProperties: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n iccUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/iccs/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/iccs/\"\n : \"../web/iccs/\",\n kind: OptionKind.API,\n },\n isEvalSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n isOffscreenCanvasSupported: {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.API,\n },\n maxImageSize: {\n /** @type {number} */\n value: -1,\n kind: OptionKind.API,\n },\n pdfBug: {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.API,\n },\n standardFontDataUrl: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../external/standard_fonts/\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/standard_fonts/\"\n : \"../web/standard_fonts/\",\n kind: OptionKind.API,\n },\n useSystemFonts: {\n // On Android, there is almost no chance to have the font we want so we\n // don't use the system fonts in this case (bug 1882613).\n /** @type {boolean|undefined} */\n value: (\n typeof PDFJSDev === \"undefined\"\n ? window.isGECKOVIEW\n : PDFJSDev.test(\"GECKOVIEW\")\n )\n ? false\n : undefined,\n kind: OptionKind.API,\n type: Type.BOOLEAN + Type.UNDEFINED,\n },\n verbosity: {\n /** @type {number} */\n value: 1,\n kind: OptionKind.API,\n },\n wasmUrl: {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/web/wasm/\"\n : \"../web/wasm/\",\n kind: OptionKind.API,\n },\n\n workerPort: {\n /** @type {Object} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? globalThis.pdfjsPreloadedWorker || null\n : null,\n kind: OptionKind.WORKER,\n },\n workerSrc: {\n /** @type {string} */\n value:\n // eslint-disable-next-line no-nested-ternary\n typeof PDFJSDev === \"undefined\"\n ? \"../src/pdf.worker.js\"\n : PDFJSDev.test(\"MOZCENTRAL\")\n ? \"resource://pdf.js/build/pdf.worker.mjs\"\n : \"../build/pdf.worker.mjs\",\n kind: OptionKind.WORKER,\n },\n};\nif (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n defaultOptions.defaultUrl = {\n /** @type {string} */\n value:\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")\n ? \"\"\n : \"compressed.tracemonkey-pldi-09.pdf\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.sandboxBundleSrc = {\n /** @type {string} */\n value:\n typeof PDFJSDev === \"undefined\"\n ? \"../build/dev-sandbox/pdf.sandbox.mjs\"\n : \"../build/pdf.sandbox.mjs\",\n kind: OptionKind.VIEWER,\n };\n defaultOptions.enableFakeMLManager = {\n /** @type {boolean} */\n value: true,\n kind: OptionKind.VIEWER,\n };\n}\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n defaultOptions.disablePreferences = {\n /** @type {boolean} */\n value: typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\"),\n kind: OptionKind.VIEWER,\n };\n} else if (PDFJSDev.test(\"CHROME\")) {\n defaultOptions.disableTelemetry = {\n /** @type {boolean} */\n value: false,\n kind: OptionKind.VIEWER + OptionKind.PREFERENCE,\n };\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING || LIB\")) {\n // Ensure that the `defaultOptions` are correctly specified.\n for (const name in defaultOptions) {\n const { value, kind, type } = defaultOptions[name];\n\n if (kind & OptionKind.PREFERENCE) {\n if (kind === OptionKind.PREFERENCE) {\n throw new Error(`Cannot use only \"PREFERENCE\" kind: ${name}`);\n }\n if (kind & OptionKind.BROWSER) {\n throw new Error(`Cannot mix \"PREFERENCE\" and \"BROWSER\" kind: ${name}`);\n }\n if (type !== undefined) {\n throw new Error(\n `Cannot have \\`type\\`-field for \"PREFERENCE\" kind: ${name}`\n );\n }\n if (typeof compatParams === \"object\" && compatParams.has(name)) {\n throw new Error(\n `Should not have compatibility-value for \"PREFERENCE\" kind: ${name}`\n );\n }\n // Only \"simple\" preference-values are allowed.\n if (\n typeof value !== \"boolean\" &&\n typeof value !== \"string\" &&\n !Number.isInteger(value)\n ) {\n throw new Error(`Invalid value for \"PREFERENCE\" kind: ${name}`);\n }\n } else if (kind & OptionKind.BROWSER) {\n if (type !== undefined) {\n throw new Error(\n `Cannot have \\`type\\`-field for \"BROWSER\" kind: ${name}`\n );\n }\n if (typeof compatParams === \"object\" && compatParams.has(name)) {\n throw new Error(\n `Should not have compatibility-value for \"BROWSER\" kind: ${name}`\n );\n }\n if (value === undefined) {\n throw new Error(`Invalid value for \"BROWSER\" kind: ${name}`);\n }\n }\n }\n}\n\nclass AppOptions {\n static eventBus;\n\n static #opts = new Map();\n\n static {\n // Initialize all the user-options.\n for (const name in defaultOptions) {\n this.#opts.set(name, defaultOptions[name].value);\n }\n\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // Apply any compatibility-values to the user-options.\n for (const [name, value] of compatParams) {\n this.#opts.set(name, value);\n }\n this._hasInvokedSet = false;\n\n this._checkDisablePreferences = () => {\n if (this.get(\"disablePreferences\")) {\n // Give custom implementations of the default viewer a simpler way to\n // opt-out of having the `Preferences` override existing `AppOptions`.\n return true;\n }\n if (this._hasInvokedSet) {\n console.warn(\n \"The Preferences may override manually set AppOptions; \" +\n 'please use the \"disablePreferences\"-option to prevent that.'\n );\n }\n return false;\n };\n }\n }\n\n constructor() {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n throw new Error(\"Cannot initialize AppOptions.\");\n }\n }\n\n static get(name) {\n return this.#opts.get(name);\n }\n\n static getAll(kind = null, defaultOnly = false) {\n const options = Object.create(null);\n for (const name in defaultOptions) {\n const defaultOpt = defaultOptions[name];\n\n if (kind && !(kind & defaultOpt.kind)) {\n continue;\n }\n options[name] = !defaultOnly ? this.#opts.get(name) : defaultOpt.value;\n }\n return options;\n }\n\n static set(name, value) {\n this.setAll({ [name]: value });\n }\n\n static setAll(options, prefs = false) {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n this._hasInvokedSet ||= true;\n }\n let events;\n\n for (const name in options) {\n const defaultOpt = defaultOptions[name],\n userOpt = options[name];\n\n if (\n !defaultOpt ||\n !(\n typeof userOpt === typeof defaultOpt.value ||\n Type[(typeof userOpt).toUpperCase()] & defaultOpt.type\n )\n ) {\n continue;\n }\n const { kind } = defaultOpt;\n\n if (\n prefs &&\n !(kind & OptionKind.BROWSER || kind & OptionKind.PREFERENCE)\n ) {\n continue;\n }\n if (this.eventBus && kind & OptionKind.EVENT_DISPATCH) {\n (events ||= new Map()).set(name, userOpt);\n }\n this.#opts.set(name, userOpt);\n }\n\n if (events) {\n for (const [name, value] of events) {\n this.eventBus.dispatch(name.toLowerCase(), { source: this, value });\n }\n }\n }\n}\n\nexport { AppOptions, OptionKind };\n","/* Copyright 2015 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/** @typedef {import(\"./event_utils\").EventBus} EventBus */\n/** @typedef {import(\"./interfaces\").IPDFLinkService} IPDFLinkService */\n\nimport { isValidExplicitDest } from \"pdfjs-lib\";\nimport { parseQueryString } from \"./ui_utils.js\";\n\nconst DEFAULT_LINK_REL = \"noopener noreferrer nofollow\";\n\nconst LinkTarget = {\n NONE: 0, // Default value.\n SELF: 1,\n BLANK: 2,\n PARENT: 3,\n TOP: 4,\n};\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n * for external links. Must use one of the values from {LinkTarget}.\n * Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n * external links. Defaults to stripping the referrer.\n * @property {boolean} [ignoreDestinationZoom] - Ignores the zoom argument,\n * thus preserving the current zoom level in the viewer, when navigating\n * to internal destinations. The default value is `false`.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nclass PDFLinkService {\n externalLinkEnabled = true;\n\n /**\n * @param {PDFLinkServiceOptions} options\n */\n constructor({\n eventBus,\n externalLinkTarget = null,\n externalLinkRel = null,\n ignoreDestinationZoom = false,\n } = {}) {\n this.eventBus = eventBus;\n this.externalLinkTarget = externalLinkTarget;\n this.externalLinkRel = externalLinkRel;\n this._ignoreDestinationZoom = ignoreDestinationZoom;\n\n this.baseUrl = null;\n this.pdfDocument = null;\n this.pdfViewer = null;\n this.pdfHistory = null;\n }\n\n setDocument(pdfDocument, baseUrl = null) {\n this.baseUrl = baseUrl;\n this.pdfDocument = pdfDocument;\n }\n\n setViewer(pdfViewer) {\n this.pdfViewer = pdfViewer;\n }\n\n setHistory(pdfHistory) {\n this.pdfHistory = pdfHistory;\n }\n\n /**\n * @type {number}\n */\n get pagesCount() {\n return this.pdfDocument ? this.pdfDocument.numPages : 0;\n }\n\n /**\n * @type {number}\n */\n get page() {\n return this.pdfDocument ? this.pdfViewer.currentPageNumber : 1;\n }\n\n /**\n * @param {number} value\n */\n set page(value) {\n if (this.pdfDocument) {\n this.pdfViewer.currentPageNumber = value;\n }\n }\n\n /**\n * @type {number}\n */\n get rotation() {\n return this.pdfDocument ? this.pdfViewer.pagesRotation : 0;\n }\n\n /**\n * @param {number} value\n */\n set rotation(value) {\n if (this.pdfDocument) {\n this.pdfViewer.pagesRotation = value;\n }\n }\n\n /**\n * @type {boolean}\n */\n get isInPresentationMode() {\n return this.pdfDocument ? this.pdfViewer.isInPresentationMode : false;\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {string|Array} dest - The named, or explicit, PDF destination.\n */\n async goToDestination(dest) {\n if (!this.pdfDocument) {\n return;\n }\n let namedDest, explicitDest, pageNumber;\n if (typeof dest === \"string\") {\n namedDest = dest;\n explicitDest = await this.pdfDocument.getDestination(dest);\n } else {\n namedDest = null;\n explicitDest = await dest;\n }\n if (!Array.isArray(explicitDest)) {\n console.error(\n `goToDestination: \"${explicitDest}\" is not a valid destination array, for dest=\"${dest}\".`\n );\n return;\n }\n // Dest array looks like that: \n const [destRef] = explicitDest;\n\n if (destRef && typeof destRef === \"object\") {\n pageNumber = this.pdfDocument.cachedPageNumber(destRef);\n\n if (!pageNumber) {\n // Fetch the page reference if it's not yet available. This could\n // only occur during loading, before all pages have been resolved.\n try {\n pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1;\n } catch {\n console.error(\n `goToDestination: \"${destRef}\" is not a valid page reference, for dest=\"${dest}\".`\n );\n return;\n }\n }\n } else if (Number.isInteger(destRef)) {\n pageNumber = destRef + 1;\n }\n if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) {\n console.error(\n `goToDestination: \"${pageNumber}\" is not a valid page number, for dest=\"${dest}\".`\n );\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new destination into\n // view, to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.push({ namedDest, explicitDest, pageNumber });\n }\n\n this.pdfViewer.scrollPageIntoView({\n pageNumber,\n destArray: explicitDest,\n ignoreDestinationZoom: this._ignoreDestinationZoom,\n });\n\n const ac = new AbortController();\n this.eventBus._on(\n \"textlayerrendered\",\n evt => {\n if (evt.pageNumber === pageNumber) {\n evt.source.textLayer.div.focus();\n ac.abort();\n }\n },\n { signal: ac.signal }\n );\n }\n\n /**\n * This method will, when available, also update the browser history.\n *\n * @param {number|string} val - The page number, or page label.\n */\n goToPage(val) {\n if (!this.pdfDocument) {\n return;\n }\n const pageNumber =\n (typeof val === \"string\" && this.pdfViewer.pageLabelToPageNumber(val)) ||\n val | 0;\n if (\n !(\n Number.isInteger(pageNumber) &&\n pageNumber > 0 &&\n pageNumber <= this.pagesCount\n )\n ) {\n console.error(`PDFLinkService.goToPage: \"${val}\" is not a valid page.`);\n return;\n }\n\n if (this.pdfHistory) {\n // Update the browser history before scrolling the new page into view,\n // to be able to accurately capture the current document position.\n this.pdfHistory.pushCurrentPosition();\n this.pdfHistory.pushPage(pageNumber);\n }\n\n this.pdfViewer.scrollPageIntoView({ pageNumber });\n }\n\n /**\n * Scrolls to a specific location in the PDF document.\n * @param {number} pageNumber - The page number to scroll to.\n * @param {number} x - The x-coordinate to scroll to in page coordinates.\n * @param {number} y - The y-coordinate to scroll to in page coordinates.\n * @param {Object} [options]\n */\n goToXY(pageNumber, x, y, options = {}) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber,\n destArray: [null, { name: \"XYZ\" }, x, y],\n ignoreDestinationZoom: true,\n ...options,\n });\n }\n\n /**\n * Adds various attributes (href, title, target, rel) to hyperlinks.\n * @param {HTMLAnchorElement} link\n * @param {string} url\n * @param {boolean} [newWindow]\n */\n addLinkAttributes(link, url, newWindow = false) {\n if (!url || typeof url !== \"string\") {\n throw new Error('A valid \"url\" parameter must provided.');\n }\n const target = newWindow ? LinkTarget.BLANK : this.externalLinkTarget,\n rel = this.externalLinkRel;\n\n if (this.externalLinkEnabled) {\n link.href = link.title = url;\n } else {\n link.href = \"\";\n link.title = `Disabled: ${url}`;\n link.onclick = () => false;\n }\n\n let targetStr = \"\"; // LinkTarget.NONE\n switch (target) {\n case LinkTarget.NONE:\n break;\n case LinkTarget.SELF:\n targetStr = \"_self\";\n break;\n case LinkTarget.BLANK:\n targetStr = \"_blank\";\n break;\n case LinkTarget.PARENT:\n targetStr = \"_parent\";\n break;\n case LinkTarget.TOP:\n targetStr = \"_top\";\n break;\n }\n link.target = targetStr;\n\n link.rel = typeof rel === \"string\" ? rel : DEFAULT_LINK_REL;\n }\n\n /**\n * @param {string|Array} dest - The PDF destination object.\n * @returns {string} The hyperlink to the PDF object.\n */\n getDestinationHash(dest) {\n if (typeof dest === \"string\") {\n if (dest.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(dest));\n }\n } else if (Array.isArray(dest)) {\n const str = JSON.stringify(dest);\n if (str.length > 0) {\n return this.getAnchorUrl(\"#\" + escape(str));\n }\n }\n return this.getAnchorUrl(\"\");\n }\n\n /**\n * Prefix the full url on anchor links to make sure that links are resolved\n * relative to the current URL instead of the one defined in .\n * @param {string} anchor - The anchor hash, including the #.\n * @returns {string} The hyperlink to the PDF object.\n */\n getAnchorUrl(anchor) {\n return this.baseUrl ? this.baseUrl + anchor : anchor;\n }\n\n /**\n * @param {string} hash\n */\n setHash(hash) {\n if (!this.pdfDocument) {\n return;\n }\n let pageNumber, dest;\n if (hash.includes(\"=\")) {\n const params = parseQueryString(hash);\n if (params.has(\"search\")) {\n const query = params.get(\"search\").replaceAll('\"', \"\"),\n phrase = params.get(\"phrase\") === \"true\";\n\n this.eventBus.dispatch(\"findfromurlhash\", {\n source: this,\n query: phrase ? query : query.match(/\\S+/g),\n });\n }\n // borrowing syntax from \"Parameters for Opening PDF Files\"\n if (params.has(\"page\")) {\n pageNumber = params.get(\"page\") | 0 || 1;\n }\n if (params.has(\"zoom\")) {\n // Build the destination array.\n const zoomArgs = params.get(\"zoom\").split(\",\"); // scale,left,top\n const zoomArg = zoomArgs[0];\n const zoomArgNumber = parseFloat(zoomArg);\n\n if (!zoomArg.includes(\"Fit\")) {\n // If the zoomArg is a number, it has to get divided by 100. If it's\n // a string, it should stay as it is.\n dest = [\n null,\n { name: \"XYZ\" },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n zoomArgs.length > 2 ? zoomArgs[2] | 0 : null,\n zoomArgNumber ? zoomArgNumber / 100 : zoomArg,\n ];\n } else if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n dest = [null, { name: zoomArg }];\n } else if (\n zoomArg === \"FitH\" ||\n zoomArg === \"FitBH\" ||\n zoomArg === \"FitV\" ||\n zoomArg === \"FitBV\"\n ) {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs.length > 1 ? zoomArgs[1] | 0 : null,\n ];\n } else if (zoomArg === \"FitR\") {\n if (zoomArgs.length !== 5) {\n console.error(\n 'PDFLinkService.setHash: Not enough parameters for \"FitR\".'\n );\n } else {\n dest = [\n null,\n { name: zoomArg },\n zoomArgs[1] | 0,\n zoomArgs[2] | 0,\n zoomArgs[3] | 0,\n zoomArgs[4] | 0,\n ];\n }\n } else {\n console.error(\n `PDFLinkService.setHash: \"${zoomArg}\" is not a valid zoom value.`\n );\n }\n }\n if (dest) {\n this.pdfViewer.scrollPageIntoView({\n pageNumber: pageNumber || this.page,\n destArray: dest,\n allowNegativeOffset: true,\n });\n } else if (pageNumber) {\n this.page = pageNumber; // simple page\n }\n if (params.has(\"pagemode\")) {\n this.eventBus.dispatch(\"pagemode\", {\n source: this,\n mode: params.get(\"pagemode\"),\n });\n }\n // Ensure that this parameter is *always* handled last, in order to\n // guarantee that it won't be overridden (e.g. by the \"page\" parameter).\n if (params.has(\"nameddest\")) {\n this.goToDestination(params.get(\"nameddest\"));\n }\n\n if (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) {\n return;\n }\n // Support opening of PDF attachments in the Firefox PDF Viewer,\n // which uses a couple of non-standard hash parameters; refer to\n // `DownloadManager.openOrDownloadData` in the firefoxcom.js file.\n if (!params.has(\"filename\") || !params.has(\"filedest\")) {\n return;\n }\n hash = params.get(\"filedest\");\n }\n\n // Named (or explicit) destination.\n dest = unescape(hash);\n try {\n dest = JSON.parse(dest);\n\n if (!Array.isArray(dest)) {\n // Avoid incorrectly rejecting a valid named destination, such as\n // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n dest = dest.toString();\n }\n } catch {}\n\n if (typeof dest === \"string\" || isValidExplicitDest(dest)) {\n this.goToDestination(dest);\n return;\n }\n console.error(\n `PDFLinkService.setHash: \"${unescape(hash)}\" is not a valid destination.`\n );\n }\n\n /**\n * @param {string} action\n */\n executeNamedAction(action) {\n if (!this.pdfDocument) {\n return;\n }\n // See PDF reference, table 8.45 - Named action\n switch (action) {\n case \"GoBack\":\n this.pdfHistory?.back();\n break;\n\n case \"GoForward\":\n this.pdfHistory?.forward();\n break;\n\n case \"NextPage\":\n this.pdfViewer.nextPage();\n break;\n\n case \"PrevPage\":\n this.pdfViewer.previousPage();\n break;\n\n case \"LastPage\":\n this.page = this.pagesCount;\n break;\n\n case \"FirstPage\":\n this.page = 1;\n break;\n\n default:\n break; // No action according to spec\n }\n\n this.eventBus.dispatch(\"namedaction\", {\n source: this,\n action,\n });\n }\n\n /**\n * @param {Object} action\n */\n async executeSetOCGState(action) {\n if (!this.pdfDocument) {\n return;\n }\n const pdfDocument = this.pdfDocument,\n optionalContentConfig = await this.pdfViewer.optionalContentConfigPromise;\n\n if (pdfDocument !== this.pdfDocument) {\n return; // The document was closed while the optional content resolved.\n }\n optionalContentConfig.setOCGState(action);\n\n this.pdfViewer.optionalContentConfigPromise = Promise.resolve(\n optionalContentConfig\n );\n }\n}\n\n/**\n * @implements {IPDFLinkService}\n */\nclass SimpleLinkService extends PDFLinkService {\n setDocument(pdfDocument, baseUrl = null) {}\n}\n\nexport { LinkTarget, PDFLinkService, SimpleLinkService };\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\nconst WaitOnType = {\n EVENT: \"event\",\n TIMEOUT: \"timeout\",\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n * `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n * timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nasync function waitOnEventOrTimeout({ target, name, delay = 0 }) {\n if (\n typeof target !== \"object\" ||\n !(name && typeof name === \"string\") ||\n !(Number.isInteger(delay) && delay >= 0)\n ) {\n throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n }\n const { promise, resolve } = Promise.withResolvers();\n const ac = new AbortController();\n\n function handler(type) {\n ac.abort(); // Remove event listener.\n clearTimeout(timeout);\n\n resolve(type);\n }\n\n const evtMethod = target instanceof EventBus ? \"_on\" : \"addEventListener\";\n target[evtMethod](name, handler.bind(null, WaitOnType.EVENT), {\n signal: ac.signal,\n });\n\n const timeout = setTimeout(handler.bind(null, WaitOnType.TIMEOUT), delay);\n\n return promise;\n}\n\n/**\n * Simple event bus for an application. Listeners are attached using the `on`\n * and `off` methods. To raise an event, the `dispatch` method shall be used.\n */\nclass EventBus {\n #listeners = Object.create(null);\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n on(eventName, listener, options = null) {\n this._on(eventName, listener, {\n external: true,\n once: options?.once,\n signal: options?.signal,\n });\n }\n\n /**\n * @param {string} eventName\n * @param {function} listener\n * @param {Object} [options]\n */\n off(eventName, listener, options = null) {\n this._off(eventName, listener);\n }\n\n /**\n * @param {string} eventName\n * @param {Object} data\n */\n dispatch(eventName, data) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners || eventListeners.length === 0) {\n return;\n }\n let externalListeners;\n // Making copy of the listeners array in case if it will be modified\n // during dispatch.\n for (const { listener, external, once } of eventListeners.slice(0)) {\n if (once) {\n this._off(eventName, listener);\n }\n if (external) {\n (externalListeners ||= []).push(listener);\n continue;\n }\n listener(data);\n }\n // Dispatch any \"external\" listeners *after* the internal ones, to give the\n // viewer components time to handle events and update their state first.\n if (externalListeners) {\n for (const listener of externalListeners) {\n listener(data);\n }\n externalListeners = null;\n }\n }\n\n /**\n * @ignore\n */\n _on(eventName, listener, options = null) {\n let rmAbort = null;\n if (options?.signal instanceof AbortSignal) {\n const { signal } = options;\n if (signal.aborted) {\n console.error(\"Cannot use an `aborted` signal.\");\n return;\n }\n const onAbort = () => this._off(eventName, listener);\n rmAbort = () => signal.removeEventListener(\"abort\", onAbort);\n\n signal.addEventListener(\"abort\", onAbort);\n }\n\n const eventListeners = (this.#listeners[eventName] ||= []);\n eventListeners.push({\n listener,\n external: options?.external === true,\n once: options?.once === true,\n rmAbort,\n });\n }\n\n /**\n * @ignore\n */\n _off(eventName, listener, options = null) {\n const eventListeners = this.#listeners[eventName];\n if (!eventListeners) {\n return;\n }\n for (let i = 0, ii = eventListeners.length; i < ii; i++) {\n const evt = eventListeners[i];\n if (evt.listener === listener) {\n evt.rmAbort?.(); // Ensure that the `AbortSignal` listener is removed.\n eventListeners.splice(i, 1);\n return;\n }\n }\n }\n}\n\n/**\n * NOTE: Only used in the Firefox built-in pdf viewer.\n */\nclass FirefoxEventBus extends EventBus {\n #externalServices;\n\n #globalEventNames;\n\n #isInAutomation;\n\n constructor(globalEventNames, externalServices, isInAutomation) {\n super();\n this.#globalEventNames = globalEventNames;\n this.#externalServices = externalServices;\n this.#isInAutomation = isInAutomation;\n }\n\n dispatch(eventName, data) {\n if (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: FirefoxEventBus.dispatch\");\n }\n super.dispatch(eventName, data);\n\n if (this.#isInAutomation) {\n const detail = Object.create(null);\n if (data) {\n for (const key in data) {\n const value = data[key];\n if (key === \"source\") {\n if (value === window || value === document) {\n return; // No need to re-dispatch (already) global events.\n }\n continue; // Ignore the `source` property.\n }\n detail[key] = value;\n }\n }\n const event = new CustomEvent(eventName, {\n bubbles: true,\n cancelable: true,\n detail,\n });\n document.dispatchEvent(event);\n }\n\n if (this.#globalEventNames?.has(eventName)) {\n this.#externalServices.dispatchGlobalEvent({\n eventName,\n detail: data,\n });\n }\n }\n}\n\nexport { EventBus, FirefoxEventBus, waitOnEventOrTimeout, WaitOnType };\n","/* Copyright 2024 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/** @typedef {import(\"./interfaces.js\").IL10n} IL10n */\n\nclass BaseExternalServices {\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BaseExternalServices\n ) {\n throw new Error(\"Cannot initialize BaseExternalServices.\");\n }\n }\n\n updateFindControlState(data) {}\n\n updateFindMatchesCount(data) {}\n\n initPassiveLoading() {}\n\n reportTelemetry(data) {}\n\n /**\n * @returns {Promise}\n */\n async createL10n() {\n throw new Error(\"Not implemented: createL10n\");\n }\n\n createScripting() {\n throw new Error(\"Not implemented: createScripting\");\n }\n\n createSignatureStorage() {\n throw new Error(\"Not implemented: createSignatureStorage\");\n }\n\n updateEditorStates(data) {\n throw new Error(\"Not implemented: updateEditorStates\");\n }\n\n dispatchGlobalEvent(_event) {}\n}\n\nexport { BaseExternalServices };\n","/* Copyright 2013 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\nimport { AppOptions, OptionKind } from \"./app_options.js\";\n\n/**\n * BasePreferences - Abstract base class for storing persistent settings.\n * Used for settings that should be applied to all opened documents,\n * or every time the viewer is loaded.\n */\nclass BasePreferences {\n #defaults = Object.freeze(\n typeof PDFJSDev === \"undefined\"\n ? AppOptions.getAll(OptionKind.PREFERENCE, /* defaultOnly = */ true)\n : PDFJSDev.eval(\"DEFAULT_PREFERENCES\")\n );\n\n #initializedPromise = null;\n\n constructor() {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) &&\n this.constructor === BasePreferences\n ) {\n throw new Error(\"Cannot initialize BasePreferences.\");\n }\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"CHROME\")) {\n Object.defineProperty(this, \"defaults\", {\n get() {\n return this.#defaults;\n },\n });\n }\n\n this.#initializedPromise = this._readFromStorage(this.#defaults).then(\n ({ browserPrefs, prefs }) => {\n if (\n (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) &&\n AppOptions._checkDisablePreferences()\n ) {\n return;\n }\n AppOptions.setAll({ ...browserPrefs, ...prefs }, /* prefs = */ true);\n }\n );\n\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n window.addEventListener(\n \"updatedPreference\",\n async ({ detail: { name, value } }) => {\n await this.#initializedPromise;\n AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n }\n );\n }\n }\n\n /**\n * Stub function for writing preferences to storage.\n * @param {Object} prefObj The preferences that should be written to storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been written.\n */\n async _writeToStorage(prefObj) {\n throw new Error(\"Not implemented: _writeToStorage\");\n }\n\n /**\n * Stub function for reading preferences from storage.\n * @param {Object} prefObj The preferences that should be read from storage.\n * @returns {Promise} A promise that is resolved with an {Object} containing\n * the preferences that have been read.\n */\n async _readFromStorage(prefObj) {\n throw new Error(\"Not implemented: _readFromStorage\");\n }\n\n /**\n * Reset the preferences to their default values and update storage.\n * @returns {Promise} A promise that is resolved when the preference values\n * have been reset.\n */\n async reset() {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Please use `about:config` to change preferences.\");\n }\n await this.#initializedPromise;\n AppOptions.setAll(this.#defaults, /* prefs = */ true);\n\n await this._writeToStorage(this.#defaults);\n }\n\n /**\n * Set the value of a preference.\n * @param {string} name The name of the preference that should be changed.\n * @param {boolean|number|string} value The new value of the preference.\n * @returns {Promise} A promise that is resolved when the value has been set,\n * provided that the preference exists and the types match.\n */\n async set(name, value) {\n await this.#initializedPromise;\n AppOptions.setAll({ [name]: value }, /* prefs = */ true);\n\n await this._writeToStorage(\n typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")\n ? { [name]: AppOptions.get(name) }\n : AppOptions.getAll(OptionKind.PREFERENCE)\n );\n }\n\n /**\n * Get the value of a preference.\n * @param {string} name The name of the preference whose value is requested.\n * @returns {Promise} A promise resolved with a {boolean|number|string}\n * containing the value of the preference.\n */\n async get(name) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"MOZCENTRAL\")) {\n throw new Error(\"Not implemented: get\");\n }\n await this.#initializedPromise;\n return AppOptions.get(name);\n }\n\n get initializedPromise() {\n return this.#initializedPromise;\n }\n}\n\nexport { BasePreferences };\n","/**\n * The `FluentType` class is the base of Fluent's type system.\n *\n * Fluent types wrap JavaScript values and store additional configuration for\n * them, which can then be used in the `toString` method together with a proper\n * `Intl` formatter.\n */\nexport class FluentType {\n /**\n * Create a `FluentType` instance.\n *\n * @param value The JavaScript value to wrap.\n */\n constructor(value) {\n this.value = value;\n }\n /**\n * Unwrap the raw value stored by this `FluentType`.\n */\n valueOf() {\n return this.value;\n }\n}\n/**\n * A {@link FluentType} representing no correct value.\n */\nexport class FluentNone extends FluentType {\n /**\n * Create an instance of `FluentNone` with an optional fallback value.\n * @param value The fallback value of this `FluentNone`.\n */\n constructor(value = \"???\") {\n super(value);\n }\n /**\n * Format this `FluentNone` to the fallback string.\n */\n toString(scope) {\n return `{${this.value}}`;\n }\n}\n/**\n * A {@link FluentType} representing a number.\n *\n * A `FluentNumber` instance stores the number value of the number it\n * represents. It may also store an option bag of options which will be passed\n * to `Intl.NumerFormat` when the `FluentNumber` is formatted to a string.\n */\nexport class FluentNumber extends FluentType {\n /**\n * Create an instance of `FluentNumber` with options to the\n * `Intl.NumberFormat` constructor.\n *\n * @param value The number value of this `FluentNumber`.\n * @param opts Options which will be passed to `Intl.NumberFormat`.\n */\n constructor(value, opts = {}) {\n super(value);\n this.opts = opts;\n }\n /**\n * Format this `FluentNumber` to a string.\n */\n toString(scope) {\n if (scope) {\n try {\n const nf = scope.memoizeIntlObject(Intl.NumberFormat, this.opts);\n return nf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n }\n }\n return this.value.toString(10);\n }\n}\n/**\n * A {@link FluentType} representing a date and time.\n *\n * A `FluentDateTime` instance stores a Date object, Temporal object, or a number\n * as a numerical timestamp in milliseconds. It may also store an\n * option bag of options which will be passed to `Intl.DateTimeFormat` when the\n * `FluentDateTime` is formatted to a string.\n */\nexport class FluentDateTime extends FluentType {\n static supportsValue(value) {\n if (typeof value === \"number\")\n return true;\n if (value instanceof Date)\n return true;\n if (value instanceof FluentType)\n return FluentDateTime.supportsValue(value.valueOf());\n // Temporary workaround to support environments without Temporal\n if (\"Temporal\" in globalThis) {\n // for TypeScript, which doesn't know about Temporal yet\n const _Temporal = globalThis.Temporal;\n if (value instanceof _Temporal.Instant ||\n value instanceof _Temporal.PlainDateTime ||\n value instanceof _Temporal.PlainDate ||\n value instanceof _Temporal.PlainMonthDay ||\n value instanceof _Temporal.PlainTime ||\n value instanceof _Temporal.PlainYearMonth) {\n return true;\n }\n }\n return false;\n }\n /**\n * Create an instance of `FluentDateTime` with options to the\n * `Intl.DateTimeFormat` constructor.\n *\n * @param value The number value of this `FluentDateTime`, in milliseconds.\n * @param opts Options which will be passed to `Intl.DateTimeFormat`.\n */\n constructor(value, opts = {}) {\n // unwrap any FluentType value, but only retain the opts from FluentDateTime\n if (value instanceof FluentDateTime) {\n opts = { ...value.opts, ...opts };\n value = value.value;\n }\n else if (value instanceof FluentType) {\n value = value.valueOf();\n }\n // Intl.DateTimeFormat defaults to gregorian calendar, but Temporal defaults to iso8601\n if (typeof value === \"object\" &&\n \"calendarId\" in value &&\n opts.calendar === undefined) {\n opts = { ...opts, calendar: value.calendarId };\n }\n super(value);\n this.opts = opts;\n }\n [Symbol.toPrimitive](hint) {\n return hint === \"string\" ? this.toString() : this.toNumber();\n }\n /**\n * Convert this `FluentDateTime` to a number.\n * Note that this isn't always possible due to the nature of Temporal objects.\n * In such cases, a TypeError will be thrown.\n */\n toNumber() {\n const value = this.value;\n if (typeof value === \"number\")\n return value;\n if (value instanceof Date)\n return value.getTime();\n if (\"epochMilliseconds\" in value) {\n return value.epochMilliseconds;\n }\n if (\"toZonedDateTime\" in value) {\n return value.toZonedDateTime(\"UTC\").epochMilliseconds;\n }\n throw new TypeError(\"Unwrapping a non-number value as a number\");\n }\n /**\n * Format this `FluentDateTime` to a string.\n */\n toString(scope) {\n if (scope) {\n try {\n const dtf = scope.memoizeIntlObject(Intl.DateTimeFormat, this.opts);\n return dtf.format(this.value);\n }\n catch (err) {\n scope.reportError(err);\n }\n }\n if (typeof this.value === \"number\" || this.value instanceof Date) {\n return new Date(this.value).toISOString();\n }\n return this.value.toString();\n }\n}\n","/**\n * The role of the Fluent resolver is to format a `Pattern` to an instance of\n * `FluentValue`. For performance reasons, primitive strings are considered\n * such instances, too.\n *\n * Translations can contain references to other messages or variables,\n * conditional logic in form of select expressions, traits which describe their\n * grammatical features, and can use Fluent builtins which make use of the\n * `Intl` formatters to format numbers and dates into the bundle's languages.\n * See the documentation of the Fluent syntax for more information.\n *\n * In case of errors the resolver will try to salvage as much of the\n * translation as possible. In rare situations where the resolver didn't know\n * how to recover from an error it will return an instance of `FluentNone`.\n *\n * All expressions resolve to an instance of `FluentValue`. The caller should\n * use the `toString` method to convert the instance to a native value.\n *\n * Functions in this file pass around an instance of the `Scope` class, which\n * stores the data required for successful resolution and error recovery.\n */\nimport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n/**\n * The maximum number of placeables which can be expanded in a single call to\n * `formatPattern`. The limit protects against the Billion Laughs and Quadratic\n * Blowup attacks. See https://msdn.microsoft.com/en-us/magazine/ee335713.aspx.\n */\nconst MAX_PLACEABLES = 100;\n/** Unicode bidi isolation characters. */\nconst FSI = \"\\u2068\";\nconst PDI = \"\\u2069\";\n/** Helper: match a variant key to the given selector. */\nfunction match(scope, selector, key) {\n if (key === selector) {\n // Both are strings.\n return true;\n }\n // XXX Consider comparing options too, e.g. minimumFractionDigits.\n if (key instanceof FluentNumber &&\n selector instanceof FluentNumber &&\n key.value === selector.value) {\n return true;\n }\n if (selector instanceof FluentNumber && typeof key === \"string\") {\n let category = scope\n .memoizeIntlObject(Intl.PluralRules, selector.opts)\n .select(selector.value);\n if (key === category) {\n return true;\n }\n }\n return false;\n}\n/** Helper: resolve the default variant from a list of variants. */\nfunction getDefault(scope, variants, star) {\n if (variants[star]) {\n return resolvePattern(scope, variants[star].value);\n }\n scope.reportError(new RangeError(\"No default\"));\n return new FluentNone();\n}\n/** Helper: resolve arguments to a call expression. */\nfunction getArguments(scope, args) {\n const positional = [];\n const named = Object.create(null);\n for (const arg of args) {\n if (arg.type === \"narg\") {\n named[arg.name] = resolveExpression(scope, arg.value);\n }\n else {\n positional.push(resolveExpression(scope, arg));\n }\n }\n return { positional, named };\n}\n/** Resolve an expression to a Fluent type. */\nfunction resolveExpression(scope, expr) {\n switch (expr.type) {\n case \"str\":\n return expr.value;\n case \"num\":\n return new FluentNumber(expr.value, {\n minimumFractionDigits: expr.precision,\n });\n case \"var\":\n return resolveVariableReference(scope, expr);\n case \"mesg\":\n return resolveMessageReference(scope, expr);\n case \"term\":\n return resolveTermReference(scope, expr);\n case \"func\":\n return resolveFunctionReference(scope, expr);\n case \"select\":\n return resolveSelectExpression(scope, expr);\n default:\n return new FluentNone();\n }\n}\n/** Resolve a reference to a variable. */\nfunction resolveVariableReference(scope, { name }) {\n let arg;\n if (scope.params) {\n // We're inside a TermReference. It's OK to reference undefined parameters.\n if (Object.prototype.hasOwnProperty.call(scope.params, name)) {\n arg = scope.params[name];\n }\n else {\n return new FluentNone(`$${name}`);\n }\n }\n else if (scope.args &&\n Object.prototype.hasOwnProperty.call(scope.args, name)) {\n // We're in the top-level Pattern or inside a MessageReference. Missing\n // variables references produce ReferenceErrors.\n arg = scope.args[name];\n }\n else {\n scope.reportError(new ReferenceError(`Unknown variable: $${name}`));\n return new FluentNone(`$${name}`);\n }\n // Return early if the argument already is an instance of FluentType.\n if (arg instanceof FluentType) {\n return arg;\n }\n // Convert the argument to a Fluent type.\n switch (typeof arg) {\n case \"string\":\n return arg;\n case \"number\":\n return new FluentNumber(arg);\n case \"object\":\n if (FluentDateTime.supportsValue(arg)) {\n return new FluentDateTime(arg);\n }\n // eslint-disable-next-line no-fallthrough\n default:\n scope.reportError(new TypeError(`Variable type not supported: $${name}, ${typeof arg}`));\n return new FluentNone(`$${name}`);\n }\n}\n/** Resolve a reference to another message. */\nfunction resolveMessageReference(scope, { name, attr }) {\n const message = scope.bundle._messages.get(name);\n if (!message) {\n scope.reportError(new ReferenceError(`Unknown message: ${name}`));\n return new FluentNone(name);\n }\n if (attr) {\n const attribute = message.attributes[attr];\n if (attribute) {\n return resolvePattern(scope, attribute);\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${name}.${attr}`);\n }\n if (message.value) {\n return resolvePattern(scope, message.value);\n }\n scope.reportError(new ReferenceError(`No value: ${name}`));\n return new FluentNone(name);\n}\n/** Resolve a call to a Term with key-value arguments. */\nfunction resolveTermReference(scope, { name, attr, args }) {\n const id = `-${name}`;\n const term = scope.bundle._terms.get(id);\n if (!term) {\n scope.reportError(new ReferenceError(`Unknown term: ${id}`));\n return new FluentNone(id);\n }\n if (attr) {\n const attribute = term.attributes[attr];\n if (attribute) {\n // Every TermReference has its own variables.\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, attribute);\n scope.params = null;\n return resolved;\n }\n scope.reportError(new ReferenceError(`Unknown attribute: ${attr}`));\n return new FluentNone(`${id}.${attr}`);\n }\n scope.params = getArguments(scope, args).named;\n const resolved = resolvePattern(scope, term.value);\n scope.params = null;\n return resolved;\n}\n/** Resolve a call to a Function with positional and key-value arguments. */\nfunction resolveFunctionReference(scope, { name, args }) {\n // Some functions are built-in. Others may be provided by the runtime via\n // the `FluentBundle` constructor.\n let func = scope.bundle._functions[name];\n if (!func) {\n scope.reportError(new ReferenceError(`Unknown function: ${name}()`));\n return new FluentNone(`${name}()`);\n }\n if (typeof func !== \"function\") {\n scope.reportError(new TypeError(`Function ${name}() is not callable`));\n return new FluentNone(`${name}()`);\n }\n try {\n let resolved = getArguments(scope, args);\n return func(resolved.positional, resolved.named);\n }\n catch (err) {\n scope.reportError(err);\n return new FluentNone(`${name}()`);\n }\n}\n/** Resolve a select expression to the member object. */\nfunction resolveSelectExpression(scope, { selector, variants, star }) {\n let sel = resolveExpression(scope, selector);\n if (sel instanceof FluentNone) {\n return getDefault(scope, variants, star);\n }\n // Match the selector against keys of each variant, in order.\n for (const variant of variants) {\n const key = resolveExpression(scope, variant.key);\n if (match(scope, sel, key)) {\n return resolvePattern(scope, variant.value);\n }\n }\n return getDefault(scope, variants, star);\n}\n/** Resolve a pattern (a complex string with placeables). */\nexport function resolveComplexPattern(scope, ptn) {\n if (scope.dirty.has(ptn)) {\n scope.reportError(new RangeError(\"Cyclic reference\"));\n return new FluentNone();\n }\n // Tag the pattern as dirty for the purpose of the current resolution.\n scope.dirty.add(ptn);\n const result = [];\n // Wrap interpolations with Directional Isolate Formatting characters\n // only when the pattern has more than one element.\n const useIsolating = scope.bundle._useIsolating && ptn.length > 1;\n for (const elem of ptn) {\n if (typeof elem === \"string\") {\n result.push(scope.bundle._transform(elem));\n continue;\n }\n scope.placeables++;\n if (scope.placeables > MAX_PLACEABLES) {\n scope.dirty.delete(ptn);\n // This is a fatal error which causes the resolver to instantly bail out\n // on this pattern. The length check protects against excessive memory\n // usage, and throwing protects against eating up the CPU when long\n // placeables are deeply nested.\n throw new RangeError(`Too many placeables expanded: ${scope.placeables}, ` +\n `max allowed is ${MAX_PLACEABLES}`);\n }\n if (useIsolating) {\n result.push(FSI);\n }\n result.push(resolveExpression(scope, elem).toString(scope));\n if (useIsolating) {\n result.push(PDI);\n }\n }\n scope.dirty.delete(ptn);\n return result.join(\"\");\n}\n/**\n * Resolve a simple or a complex Pattern to a FluentString\n * (which is really the string primitive).\n */\nfunction resolvePattern(scope, value) {\n // Resolve a simple pattern.\n if (typeof value === \"string\") {\n return scope.bundle._transform(value);\n }\n return resolveComplexPattern(scope, value);\n}\n","export class Scope {\n constructor(bundle, errors, args) {\n /**\n * The Set of patterns already encountered during this resolution.\n * Used to detect and prevent cyclic resolutions.\n * @ignore\n */\n this.dirty = new WeakSet();\n /** A dict of parameters passed to a TermReference. */\n this.params = null;\n /**\n * The running count of placeables resolved so far.\n * Used to detect the Billion Laughs and Quadratic Blowup attacks.\n * @ignore\n */\n this.placeables = 0;\n this.bundle = bundle;\n this.errors = errors;\n this.args = args;\n }\n reportError(error) {\n if (!this.errors || !(error instanceof Error)) {\n throw error;\n }\n this.errors.push(error);\n }\n memoizeIntlObject(ctor, opts) {\n let cache = this.bundle._intls.get(ctor);\n if (!cache) {\n cache = {};\n this.bundle._intls.set(ctor, cache);\n }\n let id = JSON.stringify(opts);\n if (!cache[id]) {\n // @ts-expect-error This is fine.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n cache[id] = new ctor(this.bundle.locales, opts);\n }\n return cache[id];\n }\n}\n","/**\n * @overview\n *\n * The FTL resolver ships with a number of functions built-in.\n *\n * Each function take two arguments:\n * - args - an array of positional args\n * - opts - an object of key-value args\n *\n * Arguments to functions are guaranteed to already be instances of\n * `FluentValue`. Functions must return `FluentValues` as well.\n */\nimport { FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\nfunction values(opts, allowed) {\n const unwrapped = Object.create(null);\n for (const [name, opt] of Object.entries(opts)) {\n if (allowed.includes(name)) {\n unwrapped[name] = opt.valueOf();\n }\n }\n return unwrapped;\n}\nconst NUMBER_ALLOWED = [\n \"unitDisplay\",\n \"currencyDisplay\",\n \"useGrouping\",\n \"minimumIntegerDigits\",\n \"minimumFractionDigits\",\n \"maximumFractionDigits\",\n \"minimumSignificantDigits\",\n \"maximumSignificantDigits\",\n];\n/**\n * The implementation of the `NUMBER()` builtin available to translations.\n *\n * Translations may call the `NUMBER()` builtin in order to specify formatting\n * options of a number. For example:\n *\n * pi = The value of π is {NUMBER($pi, maximumFractionDigits: 2)}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * unitDisplay\n * currencyDisplay\n * useGrouping\n * minimumIntegerDigits\n * minimumFractionDigits\n * maximumFractionDigits\n * minimumSignificantDigits\n * maximumSignificantDigits\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `NUMBER()`.\n * @param opts The named argments passed to this `NUMBER()`.\n */\nexport function NUMBER(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`NUMBER(${arg.valueOf()})`);\n }\n if (arg instanceof FluentNumber) {\n return new FluentNumber(arg.valueOf(), {\n ...arg.opts,\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n if (arg instanceof FluentDateTime) {\n return new FluentNumber(arg.toNumber(), {\n ...values(opts, NUMBER_ALLOWED),\n });\n }\n throw new TypeError(\"Invalid argument to NUMBER\");\n}\nconst DATETIME_ALLOWED = [\n \"dateStyle\",\n \"timeStyle\",\n \"fractionalSecondDigits\",\n \"dayPeriod\",\n \"hour12\",\n \"weekday\",\n \"era\",\n \"year\",\n \"month\",\n \"day\",\n \"hour\",\n \"minute\",\n \"second\",\n \"timeZoneName\",\n];\n/**\n * The implementation of the `DATETIME()` builtin available to translations.\n *\n * Translations may call the `DATETIME()` builtin in order to specify\n * formatting options of a number. For example:\n *\n * now = It's {DATETIME($today, month: \"long\")}.\n *\n * The implementation expects an array of {@link FluentValue | FluentValues} representing the\n * positional arguments, and an object of named {@link FluentValue | FluentValues} representing the\n * named parameters.\n *\n * The following options are recognized:\n *\n * dateStyle\n * timeStyle\n * fractionalSecondDigits\n * dayPeriod\n * hour12\n * weekday\n * era\n * year\n * month\n * day\n * hour\n * minute\n * second\n * timeZoneName\n *\n * Other options are ignored.\n *\n * @param args The positional arguments passed to this `DATETIME()`.\n * @param opts The named argments passed to this `DATETIME()`.\n */\nexport function DATETIME(args, opts) {\n let arg = args[0];\n if (arg instanceof FluentNone) {\n return new FluentNone(`DATETIME(${arg.valueOf()})`);\n }\n if (arg instanceof FluentDateTime || arg instanceof FluentNumber) {\n return new FluentDateTime(arg, values(opts, DATETIME_ALLOWED));\n }\n throw new TypeError(\"Invalid argument to DATETIME\");\n}\n","const cache = new Map();\nexport function getMemoizerForLocale(locales) {\n const stringLocale = Array.isArray(locales) ? locales.join(\" \") : locales;\n let memoizer = cache.get(stringLocale);\n if (memoizer === undefined) {\n memoizer = new Map();\n cache.set(stringLocale, memoizer);\n }\n return memoizer;\n}\n","import { resolveComplexPattern } from \"./resolver.js\";\nimport { Scope } from \"./scope.js\";\nimport { FluentNone } from \"./types.js\";\nimport { NUMBER, DATETIME } from \"./builtins.js\";\nimport { getMemoizerForLocale } from \"./memoizer.js\";\n/**\n * Message bundles are single-language stores of translation resources. They are\n * responsible for formatting message values and attributes to strings.\n */\nexport class FluentBundle {\n /**\n * Create an instance of `FluentBundle`.\n *\n * @example\n * ```js\n * let bundle = new FluentBundle([\"en-US\", \"en\"]);\n *\n * let bundle = new FluentBundle(locales, {useIsolating: false});\n *\n * let bundle = new FluentBundle(locales, {\n * useIsolating: true,\n * functions: {\n * NODE_ENV: () => process.env.NODE_ENV\n * }\n * });\n * ```\n *\n * @param locales - Used to instantiate `Intl` formatters used by translations.\n * @param options - Optional configuration for the bundle.\n */\n constructor(locales, { functions, useIsolating = true, transform = (v) => v, } = {}) {\n /** @ignore */\n this._terms = new Map();\n /** @ignore */\n this._messages = new Map();\n this.locales = Array.isArray(locales) ? locales : [locales];\n this._functions = {\n NUMBER,\n DATETIME,\n ...functions,\n };\n this._useIsolating = useIsolating;\n this._transform = transform;\n this._intls = getMemoizerForLocale(locales);\n }\n /**\n * Check if a message is present in the bundle.\n *\n * @param id - The identifier of the message to check.\n */\n hasMessage(id) {\n return this._messages.has(id);\n }\n /**\n * Return a raw unformatted message object from the bundle.\n *\n * Raw messages are `{value, attributes}` shapes containing translation units\n * called `Patterns`. `Patterns` are implementation-specific; they should be\n * treated as black boxes and formatted with `FluentBundle.formatPattern`.\n *\n * @param id - The identifier of the message to check.\n */\n getMessage(id) {\n return this._messages.get(id);\n }\n /**\n * Add a translation resource to the bundle.\n *\n * @example\n * ```js\n * let res = new FluentResource(\"foo = Foo\");\n * bundle.addResource(res);\n * bundle.getMessage(\"foo\");\n * // → {value: .., attributes: {..}}\n * ```\n *\n * @param res\n * @param options\n */\n addResource(res, { allowOverrides = false, } = {}) {\n const errors = [];\n for (let i = 0; i < res.body.length; i++) {\n let entry = res.body[i];\n if (entry.id.startsWith(\"-\")) {\n // Identifiers starting with a dash (-) define terms. Terms are private\n // and cannot be retrieved from FluentBundle.\n if (allowOverrides === false && this._terms.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing term: \"${entry.id}\"`));\n continue;\n }\n this._terms.set(entry.id, entry);\n }\n else {\n if (allowOverrides === false && this._messages.has(entry.id)) {\n errors.push(new Error(`Attempt to override an existing message: \"${entry.id}\"`));\n continue;\n }\n this._messages.set(entry.id, entry);\n }\n }\n return errors;\n }\n /**\n * Format a `Pattern` to a string.\n *\n * Format a raw `Pattern` into a string. `args` will be used to resolve\n * references to variables passed as arguments to the translation.\n *\n * In case of errors `formatPattern` will try to salvage as much of the\n * translation as possible and will still return a string. For performance\n * reasons, the encountered errors are not returned but instead are appended\n * to the `errors` array passed as the third argument.\n *\n * If `errors` is omitted, the first encountered error will be thrown.\n *\n * @example\n * ```js\n * let errors = [];\n * bundle.addResource(\n * new FluentResource(\"hello = Hello, {$name}!\"));\n *\n * let hello = bundle.getMessage(\"hello\");\n * if (hello.value) {\n * bundle.formatPattern(hello.value, {name: \"Jane\"}, errors);\n * // Returns \"Hello, Jane!\" and `errors` is empty.\n *\n * bundle.formatPattern(hello.value, undefined, errors);\n * // Returns \"Hello, {$name}!\" and `errors` is now:\n * // []\n * }\n * ```\n */\n formatPattern(pattern, args = null, errors = null) {\n // Resolve a simple pattern without creating a scope. No error handling is\n // required; by definition simple patterns don't have placeables.\n if (typeof pattern === \"string\") {\n return this._transform(pattern);\n }\n // Resolve a complex pattern.\n let scope = new Scope(this, errors, args);\n try {\n let value = resolveComplexPattern(scope, pattern);\n return value.toString(scope);\n }\n catch (err) {\n if (scope.errors && err instanceof Error) {\n scope.errors.push(err);\n return new FluentNone().toString(scope);\n }\n throw err;\n }\n }\n}\n","// This regex is used to iterate through the beginnings of messages and terms.\n// With the /m flag, the ^ matches at the beginning of every line.\nconst RE_MESSAGE_START = /^(-?[a-zA-Z][\\w-]*) *= */gm;\n// Both Attributes and Variants are parsed in while loops. These regexes are\n// used to break out of them.\nconst RE_ATTRIBUTE_START = /\\.([a-zA-Z][\\w-]*) *= */y;\nconst RE_VARIANT_START = /\\*?\\[/y;\nconst RE_NUMBER_LITERAL = /(-?[0-9]+(?:\\.([0-9]+))?)/y;\nconst RE_IDENTIFIER = /([a-zA-Z][\\w-]*)/y;\nconst RE_REFERENCE = /([$-])?([a-zA-Z][\\w-]*)(?:\\.([a-zA-Z][\\w-]*))?/y;\nconst RE_FUNCTION_NAME = /^[A-Z][A-Z0-9_-]*$/;\n// A \"run\" is a sequence of text or string literal characters which don't\n// require any special handling. For TextElements such special characters are: {\n// (starts a placeable), and line breaks which require additional logic to check\n// if the next line is indented. For StringLiterals they are: \\ (starts an\n// escape sequence), \" (ends the literal), and line breaks which are not allowed\n// in StringLiterals. Note that string runs may be empty; text runs may not.\nconst RE_TEXT_RUN = /([^{}\\n\\r]+)/y;\nconst RE_STRING_RUN = /([^\\\\\"\\n\\r]*)/y;\n// Escape sequences.\nconst RE_STRING_ESCAPE = /\\\\([\\\\\"])/y;\nconst RE_UNICODE_ESCAPE = /\\\\u([a-fA-F0-9]{4})|\\\\U([a-fA-F0-9]{6})/y;\n// Used for trimming TextElements and indents.\nconst RE_LEADING_NEWLINES = /^\\n+/;\nconst RE_TRAILING_SPACES = / +$/;\n// Used in makeIndent to strip spaces from blank lines and normalize CRLF to LF.\nconst RE_BLANK_LINES = / *\\r?\\n/g;\n// Used in makeIndent to measure the indentation.\nconst RE_INDENT = /( *)$/;\n// Common tokens.\nconst TOKEN_BRACE_OPEN = /{\\s*/y;\nconst TOKEN_BRACE_CLOSE = /\\s*}/y;\nconst TOKEN_BRACKET_OPEN = /\\[\\s*/y;\nconst TOKEN_BRACKET_CLOSE = /\\s*] */y;\nconst TOKEN_PAREN_OPEN = /\\s*\\(\\s*/y;\nconst TOKEN_ARROW = /\\s*->\\s*/y;\nconst TOKEN_COLON = /\\s*:\\s*/y;\n// Note the optional comma. As a deviation from the Fluent EBNF, the parser\n// doesn't enforce commas between call arguments.\nconst TOKEN_COMMA = /\\s*,?\\s*/y;\nconst TOKEN_BLANK = /\\s+/y;\n/**\n * Fluent Resource is a structure storing parsed localization entries.\n */\nexport class FluentResource {\n constructor(source) {\n this.body = [];\n RE_MESSAGE_START.lastIndex = 0;\n let cursor = 0;\n // Iterate over the beginnings of messages and terms to efficiently skip\n // comments and recover from errors.\n while (true) {\n let next = RE_MESSAGE_START.exec(source);\n if (next === null) {\n break;\n }\n cursor = RE_MESSAGE_START.lastIndex;\n try {\n this.body.push(parseMessage(next[1]));\n }\n catch (err) {\n if (err instanceof SyntaxError) {\n // Don't report any Fluent syntax errors. Skip directly to the\n // beginning of the next message or term.\n continue;\n }\n throw err;\n }\n }\n // The parser implementation is inlined below for performance reasons,\n // as well as for convenience of accessing `source` and `cursor`.\n // The parser focuses on minimizing the number of false negatives at the\n // expense of increasing the risk of false positives. In other words, it\n // aims at parsing valid Fluent messages with a success rate of 100%, but it\n // may also parse a few invalid messages which the reference parser would\n // reject. The parser doesn't perform any validation and may produce entries\n // which wouldn't make sense in the real world. For best results users are\n // advised to validate translations with the fluent-syntax parser\n // pre-runtime.\n // The parser makes an extensive use of sticky regexes which can be anchored\n // to any offset of the source string without slicing it. Errors are thrown\n // to bail out of parsing of ill-formed messages.\n function test(re) {\n re.lastIndex = cursor;\n return re.test(source);\n }\n // Advance the cursor by the char if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeChar(char, errorClass) {\n if (source[cursor] === char) {\n cursor++;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${char}`);\n }\n return false;\n }\n // Advance the cursor by the token if it matches. May be used as a predicate\n // (was the match found?) or, if errorClass is passed, as an assertion.\n function consumeToken(re, errorClass) {\n if (test(re)) {\n cursor = re.lastIndex;\n return true;\n }\n if (errorClass) {\n throw new errorClass(`Expected ${re.toString()}`);\n }\n return false;\n }\n // Execute a regex, advance the cursor, and return all capture groups.\n function match(re) {\n re.lastIndex = cursor;\n let result = re.exec(source);\n if (result === null) {\n throw new SyntaxError(`Expected ${re.toString()}`);\n }\n cursor = re.lastIndex;\n return result;\n }\n // Execute a regex, advance the cursor, and return the capture group.\n function match1(re) {\n return match(re)[1];\n }\n function parseMessage(id) {\n let value = parsePattern();\n let attributes = parseAttributes();\n if (value === null && Object.keys(attributes).length === 0) {\n throw new SyntaxError(\"Expected message value or attributes\");\n }\n return { id, value, attributes };\n }\n function parseAttributes() {\n let attrs = Object.create(null);\n while (test(RE_ATTRIBUTE_START)) {\n let name = match1(RE_ATTRIBUTE_START);\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected attribute value\");\n }\n attrs[name] = value;\n }\n return attrs;\n }\n function parsePattern() {\n let first;\n // First try to parse any simple text on the same line as the id.\n if (test(RE_TEXT_RUN)) {\n first = match1(RE_TEXT_RUN);\n }\n // If there's a placeable on the first line, parse a complex pattern.\n if (source[cursor] === \"{\" || source[cursor] === \"}\") {\n // Re-use the text parsed above, if possible.\n return parsePatternElements(first ? [first] : [], Infinity);\n }\n // RE_TEXT_VALUE stops at newlines. Only continue parsing the pattern if\n // what comes after the newline is indented.\n let indent = parseIndent();\n if (indent) {\n if (first) {\n // If there's text on the first line, the blank block is part of the\n // translation content in its entirety.\n return parsePatternElements([first, indent], indent.length);\n }\n // Otherwise, we're dealing with a block pattern, i.e. a pattern which\n // starts on a new line. Discrad the leading newlines but keep the\n // inline indent; it will be used by the dedentation logic.\n indent.value = trim(indent.value, RE_LEADING_NEWLINES);\n return parsePatternElements([indent], indent.length);\n }\n if (first) {\n // It was just a simple inline text after all.\n return trim(first, RE_TRAILING_SPACES);\n }\n return null;\n }\n // Parse a complex pattern as an array of elements.\n function parsePatternElements(elements = [], commonIndent) {\n while (true) {\n if (test(RE_TEXT_RUN)) {\n elements.push(match1(RE_TEXT_RUN));\n continue;\n }\n if (source[cursor] === \"{\") {\n elements.push(parsePlaceable());\n continue;\n }\n if (source[cursor] === \"}\") {\n throw new SyntaxError(\"Unbalanced closing brace\");\n }\n let indent = parseIndent();\n if (indent) {\n elements.push(indent);\n commonIndent = Math.min(commonIndent, indent.length);\n continue;\n }\n break;\n }\n let lastIndex = elements.length - 1;\n let lastElement = elements[lastIndex];\n // Trim the trailing spaces in the last element if it's a TextElement.\n if (typeof lastElement === \"string\") {\n elements[lastIndex] = trim(lastElement, RE_TRAILING_SPACES);\n }\n let baked = [];\n for (let element of elements) {\n if (element instanceof Indent) {\n // Dedent indented lines by the maximum common indent.\n element = element.value.slice(0, element.value.length - commonIndent);\n }\n if (element) {\n baked.push(element);\n }\n }\n return baked;\n }\n function parsePlaceable() {\n consumeToken(TOKEN_BRACE_OPEN, SyntaxError);\n let selector = parseInlineExpression();\n if (consumeToken(TOKEN_BRACE_CLOSE)) {\n return selector;\n }\n if (consumeToken(TOKEN_ARROW)) {\n let variants = parseVariants();\n consumeToken(TOKEN_BRACE_CLOSE, SyntaxError);\n return {\n type: \"select\",\n selector,\n ...variants,\n };\n }\n throw new SyntaxError(\"Unclosed placeable\");\n }\n function parseInlineExpression() {\n if (source[cursor] === \"{\") {\n // It's a nested placeable.\n return parsePlaceable();\n }\n if (test(RE_REFERENCE)) {\n let [, sigil, name, attr = null] = match(RE_REFERENCE);\n if (sigil === \"$\") {\n return { type: \"var\", name };\n }\n if (consumeToken(TOKEN_PAREN_OPEN)) {\n let args = parseArguments();\n if (sigil === \"-\") {\n // A parameterized term: -term(...).\n return { type: \"term\", name, attr, args };\n }\n if (RE_FUNCTION_NAME.test(name)) {\n return { type: \"func\", name, args };\n }\n throw new SyntaxError(\"Function names must be all upper-case\");\n }\n if (sigil === \"-\") {\n // A non-parameterized term: -term.\n return {\n type: \"term\",\n name,\n attr,\n args: [],\n };\n }\n return { type: \"mesg\", name, attr };\n }\n return parseLiteral();\n }\n function parseArguments() {\n let args = [];\n while (true) {\n switch (source[cursor]) {\n case \")\": // End of the argument list.\n cursor++;\n return args;\n case undefined: // EOF\n throw new SyntaxError(\"Unclosed argument list\");\n }\n args.push(parseArgument());\n // Commas between arguments are treated as whitespace.\n consumeToken(TOKEN_COMMA);\n }\n }\n function parseArgument() {\n let expr = parseInlineExpression();\n if (expr.type !== \"mesg\") {\n return expr;\n }\n if (consumeToken(TOKEN_COLON)) {\n // The reference is the beginning of a named argument.\n return {\n type: \"narg\",\n name: expr.name,\n value: parseLiteral(),\n };\n }\n // It's a regular message reference.\n return expr;\n }\n function parseVariants() {\n let variants = [];\n let count = 0;\n let star;\n while (test(RE_VARIANT_START)) {\n if (consumeChar(\"*\")) {\n star = count;\n }\n let key = parseVariantKey();\n let value = parsePattern();\n if (value === null) {\n throw new SyntaxError(\"Expected variant value\");\n }\n variants[count++] = { key, value };\n }\n if (count === 0) {\n return null;\n }\n if (star === undefined) {\n throw new SyntaxError(\"Expected default variant\");\n }\n return { variants, star };\n }\n function parseVariantKey() {\n consumeToken(TOKEN_BRACKET_OPEN, SyntaxError);\n let key;\n if (test(RE_NUMBER_LITERAL)) {\n key = parseNumberLiteral();\n }\n else {\n key = {\n type: \"str\",\n value: match1(RE_IDENTIFIER),\n };\n }\n consumeToken(TOKEN_BRACKET_CLOSE, SyntaxError);\n return key;\n }\n function parseLiteral() {\n if (test(RE_NUMBER_LITERAL)) {\n return parseNumberLiteral();\n }\n if (source[cursor] === '\"') {\n return parseStringLiteral();\n }\n throw new SyntaxError(\"Invalid expression\");\n }\n function parseNumberLiteral() {\n let [, value, fraction = \"\"] = match(RE_NUMBER_LITERAL);\n let precision = fraction.length;\n return {\n type: \"num\",\n value: parseFloat(value),\n precision,\n };\n }\n function parseStringLiteral() {\n consumeChar('\"', SyntaxError);\n let value = \"\";\n while (true) {\n value += match1(RE_STRING_RUN);\n if (source[cursor] === \"\\\\\") {\n value += parseEscapeSequence();\n continue;\n }\n if (consumeChar('\"')) {\n return { type: \"str\", value };\n }\n // We've reached an EOL of EOF.\n throw new SyntaxError(\"Unclosed string literal\");\n }\n }\n // Unescape known escape sequences.\n function parseEscapeSequence() {\n if (test(RE_STRING_ESCAPE)) {\n return match1(RE_STRING_ESCAPE);\n }\n if (test(RE_UNICODE_ESCAPE)) {\n let [, codepoint4, codepoint6] = match(RE_UNICODE_ESCAPE);\n let codepoint = parseInt(codepoint4 || codepoint6, 16);\n return codepoint <= 0xd7ff || 0xe000 <= codepoint\n ? // It's a Unicode scalar value.\n String.fromCodePoint(codepoint)\n : // Lonely surrogates can cause trouble when the parsing result is\n // saved using UTF-8. Use U+FFFD REPLACEMENT CHARACTER instead.\n \"�\";\n }\n throw new SyntaxError(\"Unknown escape sequence\");\n }\n // Parse blank space. Return it if it looks like indent before a pattern\n // line. Skip it othwerwise.\n function parseIndent() {\n let start = cursor;\n consumeToken(TOKEN_BLANK);\n // Check the first non-blank character after the indent.\n switch (source[cursor]) {\n case \".\":\n case \"[\":\n case \"*\":\n case \"}\":\n case undefined: // EOF\n // A special character. End the Pattern.\n return false;\n case \"{\":\n // Placeables don't require indentation (in EBNF: block-placeable).\n // Continue the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // If the first character on the line is not one of the special characters\n // listed above, it's a regular text character. Check if there's at least\n // one space of indent before it.\n if (source[cursor - 1] === \" \") {\n // It's an indented text character (in EBNF: indented-char). Continue\n // the Pattern.\n return makeIndent(source.slice(start, cursor));\n }\n // A not-indented text character is likely the identifier of the next\n // message. End the Pattern.\n return false;\n }\n // Trim blanks in text according to the given regex.\n function trim(text, re) {\n return text.replace(re, \"\");\n }\n // Normalize a blank block and extract the indent details.\n function makeIndent(blank) {\n let value = blank.replace(RE_BLANK_LINES, \"\\n\");\n let length = RE_INDENT.exec(blank)[1].length;\n return new Indent(value, length);\n }\n }\n}\nclass Indent {\n constructor(value, length) {\n this.value = value;\n this.length = length;\n }\n}\n","/**\n * A JavaScript implementation of Project Fluent, a localization\n * framework designed to unleash the expressive power of the natural language.\n *\n * @module\n */\nexport { FluentBundle } from \"./bundle.js\";\nexport { FluentResource } from \"./resource.js\";\nexport { FluentType, FluentNone, FluentNumber, FluentDateTime, } from \"./types.js\";\n","/* eslint no-console: [\"error\", {allow: [\"warn\"]}] */\n/* global console */\n// Match the opening angle bracket (<) in HTML tags, and HTML entities like\n// &, &, &.\nconst reOverlay = /<|&#?\\w+;/;\n/**\n * Elements allowed in translations even if they are not present in the source\n * HTML. They are text-level elements as defined by the HTML5 spec:\n * https://www.w3.org/TR/html5/text-level-semantics.html with the exception of:\n *\n * - a - because we don't allow href on it anyways,\n * - ruby, rt, rp - because we don't allow nested elements to be inserted.\n */\nconst TEXT_LEVEL_ELEMENTS = {\n \"http://www.w3.org/1999/xhtml\": [\n \"em\",\n \"strong\",\n \"small\",\n \"s\",\n \"cite\",\n \"q\",\n \"dfn\",\n \"abbr\",\n \"data\",\n \"time\",\n \"code\",\n \"var\",\n \"samp\",\n \"kbd\",\n \"sub\",\n \"sup\",\n \"i\",\n \"b\",\n \"u\",\n \"mark\",\n \"bdi\",\n \"bdo\",\n \"span\",\n \"br\",\n \"wbr\",\n ],\n};\nconst LOCALIZABLE_ATTRIBUTES = {\n \"http://www.w3.org/1999/xhtml\": {\n global: [\"title\", \"aria-description\", \"aria-label\", \"aria-valuetext\"],\n a: [\"download\"],\n area: [\"download\", \"alt\"],\n // value is special-cased in isAttrNameLocalizable\n input: [\"alt\", \"placeholder\"],\n menuitem: [\"label\"],\n menu: [\"label\"],\n optgroup: [\"label\"],\n option: [\"label\"],\n track: [\"label\"],\n img: [\"alt\"],\n textarea: [\"placeholder\"],\n th: [\"abbr\"],\n },\n \"http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul\": {\n global: [\n \"accesskey\",\n \"aria-label\",\n \"aria-valuetext\",\n \"label\",\n \"title\",\n \"tooltiptext\",\n ],\n description: [\"value\"],\n key: [\"key\", \"keycode\"],\n label: [\"value\"],\n textbox: [\"placeholder\", \"value\"],\n },\n};\n/**\n * Translate an element.\n *\n * Translate the element's text content and attributes. Some HTML markup is\n * allowed in the translation. The element's children with the data-l10n-name\n * attribute will be treated as arguments to the translation. If the\n * translation defines the same children, their attributes and text contents\n * will be used for translating the matching source child.\n *\n * @param {Element} element\n * @param {Object} translation\n * @private\n */\nexport default function translateElement(element, translation) {\n const { value } = translation;\n if (typeof value === \"string\") {\n if (element.localName === \"title\" &&\n element.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\n // A special case for the HTML title element whose content must be text.\n element.textContent = value;\n }\n else if (!reOverlay.test(value)) {\n // If the translation doesn't contain any markup skip the overlay logic.\n element.textContent = value;\n }\n else {\n // Else parse the translation's HTML using an inert template element,\n // sanitize it and replace the element's content.\n const templateElement = element.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", \"template\");\n templateElement.innerHTML = value;\n overlayChildNodes(templateElement.content, element);\n }\n }\n // Even if the translation doesn't define any localizable attributes, run\n // overlayAttributes to remove any localizable attributes set by previous\n // translations.\n overlayAttributes(translation, element);\n}\n/**\n * Replace child nodes of an element with child nodes of another element.\n *\n * The contents of the target element will be cleared and fully replaced with\n * sanitized contents of the source element.\n *\n * @param {DocumentFragment} fromFragment - The source of children to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayChildNodes(fromFragment, toElement) {\n for (const childNode of fromFragment.childNodes) {\n if (childNode.nodeType === childNode.TEXT_NODE) {\n // Keep the translated text node.\n continue;\n }\n if (childNode.hasAttribute(\"data-l10n-name\")) {\n const sanitized = getNodeForNamedElement(toElement, childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n if (isElementAllowed(childNode)) {\n const sanitized = createSanitizedElement(childNode);\n fromFragment.replaceChild(sanitized, childNode);\n continue;\n }\n console.warn(`An element of forbidden type \"${childNode.localName}\" was found in ` +\n \"the translation. Only safe text-level elements and elements with \" +\n \"data-l10n-name are allowed.\");\n // If all else fails, replace the element with its text content.\n fromFragment.replaceChild(createTextNodeFromTextContent(childNode), childNode);\n }\n toElement.textContent = \"\";\n toElement.appendChild(fromFragment);\n}\nfunction hasAttribute(attributes, name) {\n if (!attributes) {\n return false;\n }\n for (let attr of attributes) {\n if (attr.name === name) {\n return true;\n }\n }\n return false;\n}\n/**\n * Transplant localizable attributes of an element to another element.\n *\n * Any localizable attributes already set on the target element will be\n * cleared.\n *\n * @param {Element|Object} fromElement - The source of child nodes to overlay.\n * @param {Element} toElement - The target of the overlay.\n * @private\n */\nfunction overlayAttributes(fromElement, toElement) {\n const explicitlyAllowed = toElement.hasAttribute(\"data-l10n-attrs\")\n ? toElement\n .getAttribute(\"data-l10n-attrs\")\n .split(\",\")\n .map(i => i.trim())\n : null;\n // Remove existing localizable attributes if they\n // will not be used in the new translation.\n for (const attr of Array.from(toElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n !hasAttribute(fromElement.attributes, attr.name)) {\n toElement.removeAttribute(attr.name);\n }\n }\n // fromElement might be a {value, attributes} object as returned by\n // Localization.messageFromBundle. In which case attributes may be null to\n // save GC cycles.\n if (!fromElement.attributes) {\n return;\n }\n // Set localizable attributes.\n for (const attr of Array.from(fromElement.attributes)) {\n if (isAttrNameLocalizable(attr.name, toElement, explicitlyAllowed) &&\n toElement.getAttribute(attr.name) !== attr.value) {\n toElement.setAttribute(attr.name, attr.value);\n }\n }\n}\n/**\n * Sanitize a child element created by the translation.\n *\n * Try to find a corresponding child in sourceElement and use it as the base\n * for the sanitization. This will preserve functional attribtues defined on\n * the child element in the source HTML.\n *\n * @param {Element} sourceElement - The source for data-l10n-name lookups.\n * @param {Element} translatedChild - The translated child to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction getNodeForNamedElement(sourceElement, translatedChild) {\n const childName = translatedChild.getAttribute(\"data-l10n-name\");\n const sourceChild = sourceElement.querySelector(`[data-l10n-name=\"${childName}\"]`);\n if (!sourceChild) {\n console.warn(`An element named \"${childName}\" wasn't found in the source.`);\n return createTextNodeFromTextContent(translatedChild);\n }\n if (sourceChild.localName !== translatedChild.localName) {\n console.warn(`An element named \"${childName}\" was found in the translation ` +\n `but its type ${translatedChild.localName} didn't match the ` +\n `element found in the source (${sourceChild.localName}).`);\n return createTextNodeFromTextContent(translatedChild);\n }\n // Remove it from sourceElement so that the translation cannot use\n // the same reference name again.\n sourceElement.removeChild(sourceChild);\n // We can't currently guarantee that a translation won't remove\n // sourceChild from the element completely, which could break the app if\n // it relies on an event handler attached to the sourceChild. Let's make\n // this limitation explicit for now by breaking the identitiy of the\n // sourceChild by cloning it. This will destroy all event handlers\n // attached to sourceChild via addEventListener and via on\n // properties.\n const clone = sourceChild.cloneNode(false);\n return shallowPopulateUsing(translatedChild, clone);\n}\n/**\n * Sanitize an allowed element.\n *\n * Text-level elements allowed in translations may only use safe attributes\n * and will have any nested markup stripped to text content.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Element}\n * @private\n */\nfunction createSanitizedElement(element) {\n // Start with an empty element of the same type to remove nested children\n // and non-localizable attributes defined by the translation.\n const clone = element.ownerDocument.createElement(element.localName);\n return shallowPopulateUsing(element, clone);\n}\n/**\n * Convert an element to a text node.\n *\n * @param {Element} element - The element to be sanitized.\n * @returns {Node}\n * @private\n */\nfunction createTextNodeFromTextContent(element) {\n return element.ownerDocument.createTextNode(element.textContent);\n}\n/**\n * Check if element is allowed in the translation.\n *\n * This method is used by the sanitizer when the translation markup contains\n * an element which is not present in the source code.\n *\n * @param {Element} element\n * @returns {boolean}\n * @private\n */\nfunction isElementAllowed(element) {\n const allowed = TEXT_LEVEL_ELEMENTS[element.namespaceURI];\n return allowed && allowed.includes(element.localName);\n}\n/**\n * Check if attribute is allowed for the given element.\n *\n * This method is used by the sanitizer when the translation markup contains\n * DOM attributes, or when the translation has traits which map to DOM\n * attributes.\n *\n * `explicitlyAllowed` can be passed as a list of attributes explicitly\n * allowed on this element.\n *\n * @param {string} name\n * @param {Element} element\n * @param {Array} explicitlyAllowed\n * @returns {boolean}\n * @private\n */\nfunction isAttrNameLocalizable(name, element, explicitlyAllowed = null) {\n if (explicitlyAllowed && explicitlyAllowed.includes(name)) {\n return true;\n }\n const allowed = LOCALIZABLE_ATTRIBUTES[element.namespaceURI];\n if (!allowed) {\n return false;\n }\n const attrName = name.toLowerCase();\n const elemName = element.localName;\n // Is it a globally safe attribute?\n if (allowed.global.includes(attrName)) {\n return true;\n }\n // Are there no allowed attributes for this element?\n if (!allowed[elemName]) {\n return false;\n }\n // Is it allowed on this element?\n if (allowed[elemName].includes(attrName)) {\n return true;\n }\n // Special case for value on HTML inputs with type button, reset, submit\n if (element.namespaceURI === \"http://www.w3.org/1999/xhtml\" &&\n elemName === \"input\" &&\n attrName === \"value\") {\n const type = element.type.toLowerCase();\n if (type === \"submit\" || type === \"button\" || type === \"reset\") {\n return true;\n }\n }\n return false;\n}\n/**\n * Helper to set textContent and localizable attributes on an element.\n *\n * @param {Element} fromElement\n * @param {Element} toElement\n * @returns {Element}\n * @private\n */\nfunction shallowPopulateUsing(fromElement, toElement) {\n toElement.textContent = fromElement.textContent;\n overlayAttributes(fromElement, toElement);\n return toElement;\n}\n","/*\n * Base CachedIterable class.\n */\nexport default class CachedIterable extends Array {\n /**\n * Create a `CachedIterable` instance from an iterable or, if another\n * instance of `CachedIterable` is passed, return it without any\n * modifications.\n *\n * @param {Iterable} iterable\n * @returns {CachedIterable}\n */\n static from(iterable) {\n if (iterable instanceof this) {\n return iterable;\n }\n\n return new this(iterable);\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedSyncIterable caches the elements yielded by an iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedSyncIterable extends CachedIterable {\n /**\n * Create an `CachedSyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedSyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n [Symbol.iterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && last.done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","import CachedIterable from \"./cached_iterable.mjs\";\n\n/*\n * CachedAsyncIterable caches the elements yielded by an async iterable.\n *\n * It can be used to iterate over an iterable many times without depleting the\n * iterable.\n */\nexport default class CachedAsyncIterable extends CachedIterable {\n /**\n * Create an `CachedAsyncIterable` instance.\n *\n * @param {Iterable} iterable\n * @returns {CachedAsyncIterable}\n */\n constructor(iterable) {\n super();\n\n if (Symbol.asyncIterator in Object(iterable)) {\n this.iterator = iterable[Symbol.asyncIterator]();\n } else if (Symbol.iterator in Object(iterable)) {\n this.iterator = iterable[Symbol.iterator]();\n } else {\n throw new TypeError(\"Argument must implement the iteration protocol.\");\n }\n }\n\n /**\n * Asynchronous iterator caching the yielded elements.\n *\n * Elements yielded by the original iterable will be cached and available\n * synchronously. Returns an async generator object implementing the\n * iterator protocol over the elements of the original (async or sync)\n * iterable.\n */\n [Symbol.asyncIterator]() {\n const cached = this;\n let cur = 0;\n\n return {\n async next() {\n if (cached.length <= cur) {\n cached.push(cached.iterator.next());\n }\n return cached[cur++];\n }\n };\n }\n\n /**\n * This method allows user to consume the next element from the iterator\n * into the cache.\n *\n * @param {number} count - number of elements to consume\n */\n async touchNext(count = 1) {\n let idx = 0;\n while (idx++ < count) {\n const last = this[this.length - 1];\n if (last && (await last).done) {\n break;\n }\n this.push(this.iterator.next());\n }\n // Return the last cached {value, done} object to allow the calling\n // code to decide if it needs to call touchNext again.\n return this[this.length - 1];\n }\n}\n","export {default as CachedSyncIterable} from \"./cached_sync_iterable.mjs\";\nexport {default as CachedAsyncIterable} from \"./cached_async_iterable.mjs\";\n","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n/* global console */\nimport { CachedAsyncIterable } from \"cached-iterable\";\n/**\n * The `Localization` class is a central high-level API for vanilla\n * JavaScript use of Fluent.\n * It combines language negotiation, FluentBundle and I/O to\n * provide a scriptable API to format translations.\n */\nexport default class Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n *\n * @returns {Localization}\n */\n constructor(resourceIds = [], generateBundles) {\n this.resourceIds = resourceIds;\n this.generateBundles = generateBundles;\n this.onChange(true);\n }\n addResourceIds(resourceIds, eager = false) {\n this.resourceIds.push(...resourceIds);\n this.onChange(eager);\n return this.resourceIds.length;\n }\n removeResourceIds(resourceIds) {\n this.resourceIds = this.resourceIds.filter(r => !resourceIds.includes(r));\n this.onChange();\n return this.resourceIds.length;\n }\n /**\n * Format translations and handle fallback if needed.\n *\n * Format translations for `keys` from `FluentBundle` instances on this\n * DOMLocalization. In case of errors, fetch the next context in the\n * fallback chain.\n *\n * @param {Array} keys - Translation keys to format.\n * @param {Function} method - Formatting function.\n * @returns {Promise>}\n * @private\n */\n async formatWithFallback(keys, method) {\n const translations = [];\n let hasAtLeastOneBundle = false;\n for await (const bundle of this.bundles) {\n hasAtLeastOneBundle = true;\n const missingIds = keysFromBundle(method, bundle, keys, translations);\n if (missingIds.size === 0) {\n break;\n }\n if (typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const ids = Array.from(missingIds).join(\", \");\n console.warn(`[fluent] Missing translations in ${locale}: ${ids}`);\n }\n }\n if (!hasAtLeastOneBundle && typeof console !== \"undefined\") {\n console.warn(`[fluent] Request for keys failed because no resource bundles got generated.\n keys: ${JSON.stringify(keys)}.\n resourceIds: ${JSON.stringify(this.resourceIds)}.`);\n }\n return translations;\n }\n /**\n * Format translations into `{value, attributes}` objects.\n *\n * The fallback logic is the same as in `formatValues`\n * but it returns `{value, attributes}` objects\n * which are suitable for the translation of DOM elements.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatMessages([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // [\n * // { value: 'Hello, Mary!', attributes: null },\n * // {\n * // value: 'Welcome!',\n * // attributes: [ { name: \"title\", value: 'Hello' } ]\n * // }\n * // ]\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n * @private\n */\n formatMessages(keys) {\n return this.formatWithFallback(keys, messageFromBundle);\n }\n /**\n * Retrieve translations corresponding to the passed keys.\n *\n * A generalized version of `DOMLocalization.formatValue`. Keys must\n * be `{id, args}` objects.\n *\n * Returns a Promise resolving to an array of the translation strings.\n *\n * @example\n * ```js\n * docL10n.formatValues([\n * {id: 'hello', args: { who: 'Mary' }},\n * {id: 'hello', args: { who: 'John' }},\n * {id: 'welcome'}\n * ]).then(console.log);\n *\n * // ['Hello, Mary!', 'Hello, John!', 'Welcome!']\n * ```\n *\n * @param {Array} keys\n * @returns {Promise>}\n */\n formatValues(keys) {\n return this.formatWithFallback(keys, valueFromBundle);\n }\n /**\n * Retrieve the translation corresponding to the `id` identifier.\n *\n * If passed, `args` is a simple hash object with a list of variables that\n * will be interpolated in the value of the translation.\n *\n * Returns a Promise resolving to the translation string.\n *\n * Use this sparingly for one-off messages which don't need to be\n * retranslated when the user changes their language preferences, e.g. in\n * notifications.\n *\n * @example\n * ```js\n * docL10n.formatValue(\n * 'hello', { who: 'world' }\n * ).then(console.log);\n *\n * // 'Hello, world!'\n * ```\n *\n * @param {string} id - Identifier of the translation to format\n * @param {Object} [args] - Optional external arguments\n * @returns {Promise}\n */\n async formatValue(id, args) {\n const [val] = await this.formatValues([{ id, args }]);\n return val;\n }\n handleEvent() {\n this.onChange();\n }\n /**\n * This method should be called when there's a reason to believe\n * that language negotiation or available resources changed.\n */\n onChange(eager = false) {\n this.bundles = CachedAsyncIterable.from(this.generateBundles(this.resourceIds));\n if (eager) {\n this.bundles.touchNext(2);\n }\n }\n}\n/**\n * Format the value of a message into a string or `null`.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a value of a single L10n Entity using provided `FluentBundle`.\n *\n * If the message doesn't have a value, return `null`.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {string|null}\n * @private\n */\nfunction valueFromBundle(bundle, errors, message, args) {\n if (message.value) {\n return bundle.formatPattern(message.value, args, errors);\n }\n return null;\n}\n/**\n * Format all public values of a message into a {value, attributes} object.\n *\n * This function is passed as a method to `keysFromBundle` and resolve\n * a single L10n Entity using provided `FluentBundle`.\n *\n * The function will return an object with a value and attributes of the\n * entity.\n *\n * @param {FluentBundle} bundle\n * @param {Array} errors\n * @param {Object} message\n * @param {Object} args\n * @returns {Object}\n * @private\n */\nfunction messageFromBundle(bundle, errors, message, args) {\n const formatted = {\n value: null,\n attributes: null,\n };\n if (message.value) {\n formatted.value = bundle.formatPattern(message.value, args, errors);\n }\n let attrNames = Object.keys(message.attributes);\n if (attrNames.length > 0) {\n formatted.attributes = new Array(attrNames.length);\n for (let [i, name] of attrNames.entries()) {\n let value = bundle.formatPattern(message.attributes[name], args, errors);\n formatted.attributes[i] = { name, value };\n }\n }\n return formatted;\n}\n/**\n * This function is an inner function for `Localization.formatWithFallback`.\n *\n * It takes a `FluentBundle`, list of l10n-ids and a method to be used for\n * key resolution (either `valueFromBundle` or `messageFromBundle`) and\n * optionally a value returned from `keysFromBundle` executed against\n * another `FluentBundle`.\n *\n * The idea here is that if the previous `FluentBundle` did not resolve\n * all keys, we're calling this function with the next context to resolve\n * the remaining ones.\n *\n * In the function, we loop over `keys` and check if we have the `prev`\n * passed and if it has an error entry for the position we're in.\n *\n * If it doesn't, it means that we have a good translation for this key and\n * we return it. If it does, we'll try to resolve the key using the passed\n * `FluentBundle`.\n *\n * In the end, we fill the translations array, and return the Set with\n * missing ids.\n *\n * See `Localization.formatWithFallback` for more info on how this is used.\n *\n * @param {Function} method\n * @param {FluentBundle} bundle\n * @param {Array} keys\n * @param {{Array<{value: string, attributes: Object}>}} translations\n *\n * @returns {Set}\n * @private\n */\nfunction keysFromBundle(method, bundle, keys, translations) {\n const messageErrors = [];\n const missingIds = new Set();\n keys.forEach(({ id, args }, i) => {\n if (translations[i] !== undefined) {\n return;\n }\n let message = bundle.getMessage(id);\n if (message) {\n messageErrors.length = 0;\n translations[i] = method(bundle, messageErrors, message, args);\n if (messageErrors.length > 0 && typeof console !== \"undefined\") {\n const locale = bundle.locales[0];\n const errors = messageErrors.join(\", \");\n console.warn(`[fluent][resolver] errors in ${locale}/${id}: ${errors}.`);\n }\n }\n else {\n missingIds.add(id);\n }\n });\n return missingIds;\n}\n","import translateElement from \"./overlay.js\";\nimport Localization from \"./localization.js\";\nconst L10NID_ATTR_NAME = \"data-l10n-id\";\nconst L10NARGS_ATTR_NAME = \"data-l10n-args\";\nconst L10N_ELEMENT_QUERY = `[${L10NID_ATTR_NAME}]`;\n/**\n * The `DOMLocalization` class is responsible for fetching resources and\n * formatting translations.\n *\n * It implements the fallback strategy in case of errors encountered during the\n * formatting of translations and methods for observing DOM\n * trees with a `MutationObserver`.\n */\nexport default class DOMLocalization extends Localization {\n /**\n * @param {Array} resourceIds - List of resource IDs\n * @param {Function} generateBundles - Function that returns a\n * generator over FluentBundles\n * @returns {DOMLocalization}\n */\n constructor(resourceIds, generateBundles) {\n super(resourceIds, generateBundles);\n // A Set of DOM trees observed by the `MutationObserver`.\n this.roots = new Set();\n // requestAnimationFrame handler.\n this.pendingrAF = null;\n // list of elements pending for translation.\n this.pendingElements = new Set();\n this.windowElement = null;\n this.mutationObserver = null;\n this.observerConfig = {\n attributes: true,\n characterData: false,\n childList: true,\n subtree: true,\n attributeFilter: [L10NID_ATTR_NAME, L10NARGS_ATTR_NAME],\n };\n }\n onChange(eager = false) {\n super.onChange(eager);\n if (this.roots) {\n this.translateRoots();\n }\n }\n /**\n * Set the `data-l10n-id` and `data-l10n-args` attributes on DOM elements.\n * FluentDOM makes use of mutation observers to detect changes\n * to `data-l10n-*` attributes and translate elements asynchronously.\n * `setAttributes` is a convenience method which allows to translate\n * DOM elements declaratively.\n *\n * You should always prefer to use `data-l10n-id` on elements (statically in\n * HTML or dynamically via `setAttributes`) over manually retrieving\n * translations with `format`. The use of attributes ensures that the\n * elements can be retranslated when the user changes their language\n * preferences.\n *\n * ```javascript\n * localization.setAttributes(\n * document.querySelector('#welcome'), 'hello', { who: 'world' }\n * );\n * ```\n *\n * This will set the following attributes on the `#welcome` element.\n * The MutationObserver will pick up this change and will localize the element\n * asynchronously.\n *\n * ```html\n *

\n *

\n * ```\n *\n * @param {Element} element - Element to set attributes on\n * @param {string} id - l10n-id string\n * @param {Object} args - KVP list of l10n arguments\n * @returns {Element}\n */\n setAttributes(element, id, args) {\n element.setAttribute(L10NID_ATTR_NAME, id);\n if (args) {\n element.setAttribute(L10NARGS_ATTR_NAME, JSON.stringify(args));\n }\n else {\n element.removeAttribute(L10NARGS_ATTR_NAME);\n }\n return element;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements.\n *\n * ```javascript\n * localization.getAttributes(\n * document.querySelector('#welcome')\n * );\n * // -> { id: 'hello', args: { who: 'world' } }\n * ```\n *\n * @param {Element} element - HTML element\n * @returns {{id: string, args: Object}}\n */\n getAttributes(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n /**\n * Add `newRoot` to the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, start observing\n * `newRoot` in order to translate mutations in it.\n *\n * @param {Element | DocumentFragment} newRoot - Root to observe.\n */\n connectRoot(newRoot) {\n for (const root of this.roots) {\n if (root === newRoot ||\n root.contains(newRoot) ||\n newRoot.contains(root)) {\n throw new Error(\"Cannot add a root that overlaps with existing root.\");\n }\n }\n if (this.windowElement) {\n if (this.windowElement !== newRoot.ownerDocument.defaultView) {\n throw new Error(`Cannot connect a root:\n DOMLocalization already has a root from a different window.`);\n }\n }\n else {\n this.windowElement = newRoot.ownerDocument.defaultView;\n this.mutationObserver = new this.windowElement.MutationObserver(mutations => this.translateMutations(mutations));\n }\n this.roots.add(newRoot);\n this.mutationObserver.observe(newRoot, this.observerConfig);\n }\n /**\n * Remove `root` from the list of roots managed by this `DOMLocalization`.\n *\n * Additionally, if this `DOMLocalization` has an observer, stop observing\n * `root`.\n *\n * Returns `true` if the root was the last one managed by this\n * `DOMLocalization`.\n *\n * @param {Element | DocumentFragment} root - Root to disconnect.\n * @returns {boolean}\n */\n disconnectRoot(root) {\n this.roots.delete(root);\n // Pause the mutation observer to stop observing `root`.\n this.pauseObserving();\n if (this.roots.size === 0) {\n this.mutationObserver = null;\n if (this.windowElement && this.pendingrAF) {\n this.windowElement.cancelAnimationFrame(this.pendingrAF);\n }\n this.windowElement = null;\n this.pendingrAF = null;\n this.pendingElements.clear();\n return true;\n }\n // Resume observing all other roots.\n this.resumeObserving();\n return false;\n }\n /**\n * Translate all roots associated with this `DOMLocalization`.\n *\n * @returns {Promise}\n */\n translateRoots() {\n const roots = Array.from(this.roots);\n return Promise.all(roots.map(root => this.translateFragment(root)));\n }\n /**\n * Pauses the `MutationObserver`.\n */\n pauseObserving() {\n if (!this.mutationObserver) {\n return;\n }\n this.translateMutations(this.mutationObserver.takeRecords());\n this.mutationObserver.disconnect();\n }\n /**\n * Resumes the `MutationObserver`.\n */\n resumeObserving() {\n if (!this.mutationObserver) {\n return;\n }\n for (const root of this.roots) {\n this.mutationObserver.observe(root, this.observerConfig);\n }\n }\n /**\n * Translate mutations detected by the `MutationObserver`.\n *\n * @private\n */\n translateMutations(mutations) {\n for (const mutation of mutations) {\n switch (mutation.type) {\n case \"attributes\":\n if (mutation.target.hasAttribute(\"data-l10n-id\")) {\n this.pendingElements.add(mutation.target);\n }\n break;\n case \"childList\":\n for (const addedNode of mutation.addedNodes) {\n if (addedNode.nodeType === addedNode.ELEMENT_NODE) {\n if (addedNode.childElementCount) {\n for (const element of this.getTranslatables(addedNode)) {\n this.pendingElements.add(element);\n }\n }\n else if (addedNode.hasAttribute(L10NID_ATTR_NAME)) {\n this.pendingElements.add(addedNode);\n }\n }\n }\n break;\n }\n }\n // This fragment allows us to coalesce all pending translations\n // into a single requestAnimationFrame.\n if (this.pendingElements.size > 0) {\n if (this.pendingrAF === null) {\n this.pendingrAF = this.windowElement.requestAnimationFrame(() => {\n this.translateElements(Array.from(this.pendingElements));\n this.pendingElements.clear();\n this.pendingrAF = null;\n });\n }\n }\n }\n /**\n * Translate a DOM element or fragment asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a DOM fragment.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {Element | DocumentFragment} frag - Element or DocumentFragment to be translated\n * @returns {Promise}\n */\n translateFragment(frag) {\n return this.translateElements(this.getTranslatables(frag));\n }\n /**\n * Translate a list of DOM elements asynchronously using this\n * `DOMLocalization` object.\n *\n * Manually trigger the translation (or re-translation) of a list of elements.\n * Use the `data-l10n-id` and `data-l10n-args` attributes to mark up the DOM\n * with information about which translations to use.\n *\n * Returns a `Promise` that gets resolved once the translation is complete.\n *\n * @param {Array} elements - List of elements to be translated\n * @returns {Promise}\n */\n async translateElements(elements) {\n if (!elements.length) {\n return undefined;\n }\n const keys = elements.map(this.getKeysForElement);\n const translations = await this.formatMessages(keys);\n return this.applyTranslations(elements, translations);\n }\n /**\n * Applies translations onto elements.\n *\n * @param {Array} elements\n * @param {Array} translations\n * @private\n */\n applyTranslations(elements, translations) {\n this.pauseObserving();\n for (let i = 0; i < elements.length; i++) {\n if (translations[i] !== undefined) {\n translateElement(elements[i], translations[i]);\n }\n }\n this.resumeObserving();\n }\n /**\n * Collects all translatable child elements of the element.\n *\n * @param {Element | DocumentFragment} element\n * @returns {Array}\n * @private\n */\n getTranslatables(element) {\n const nodes = Array.from(element.querySelectorAll(L10N_ELEMENT_QUERY));\n if (typeof element.hasAttribute === \"function\" &&\n element.hasAttribute(L10NID_ATTR_NAME)) {\n nodes.push(element);\n }\n return nodes;\n }\n /**\n * Get the `data-l10n-*` attributes from DOM elements as a two-element\n * array.\n *\n * @param {Element} element\n * @returns {Object}\n * @private\n */\n getKeysForElement(element) {\n return {\n id: element.getAttribute(L10NID_ATTR_NAME),\n args: JSON.parse(element.getAttribute(L10NARGS_ATTR_NAME) || null),\n };\n }\n}\n","export { default as DOMLocalization } from \"./dom_localization.js\";\nexport { default as Localization } from \"./localization.js\";\n","/* Copyright 2023 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/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\n/**\n * NOTE: The L10n-implementations should use lowercase language-codes\n * internally.\n * @implements {IL10n}\n */\nclass L10n {\n #dir;\n\n #elements;\n\n #lang;\n\n #l10n;\n\n constructor({ lang, isRTL }, l10n = null) {\n this.#lang = L10n.#fixupLangCode(lang);\n this.#l10n = l10n;\n this.#dir = (isRTL ?? L10n.#isRTL(this.#lang)) ? \"rtl\" : \"ltr\";\n }\n\n _setL10n(l10n) {\n this.#l10n = l10n;\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n document.l10n = l10n;\n }\n }\n\n /** @inheritdoc */\n getLanguage() {\n return this.#lang;\n }\n\n /** @inheritdoc */\n getDirection() {\n return this.#dir;\n }\n\n /** @inheritdoc */\n async get(ids, args = null, fallback) {\n if (Array.isArray(ids)) {\n ids = ids.map(id => ({ id }));\n const messages = await this.#l10n.formatMessages(ids);\n return messages.map(message => message.value);\n }\n\n const messages = await this.#l10n.formatMessages([\n {\n id: ids,\n args,\n },\n ]);\n return messages[0]?.value || fallback;\n }\n\n /** @inheritdoc */\n async translate(element) {\n (this.#elements ||= new Set()).add(element);\n try {\n this.#l10n.connectRoot(element);\n await this.#l10n.translateRoots();\n } catch {\n // Element is under an existing root, so there is no need to add it again.\n }\n }\n\n /** @inheritdoc */\n async translateOnce(element) {\n try {\n await this.#l10n.translateElements([element]);\n } catch (ex) {\n console.error(\"translateOnce:\", ex);\n }\n }\n\n /** @inheritdoc */\n async destroy() {\n if (this.#elements) {\n for (const element of this.#elements) {\n this.#l10n.disconnectRoot(element);\n }\n this.#elements.clear();\n this.#elements = null;\n }\n this.#l10n.pauseObserving();\n }\n\n /** @inheritdoc */\n pause() {\n this.#l10n.pauseObserving();\n }\n\n /** @inheritdoc */\n resume() {\n this.#l10n.resumeObserving();\n }\n\n static #fixupLangCode(langCode) {\n // Use only lowercase language-codes internally, and fallback to English.\n langCode = langCode?.toLowerCase() || \"en-us\";\n\n // Try to support \"incompletely\" specified language codes (see issue 13689).\n const PARTIAL_LANG_CODES = {\n en: \"en-us\",\n es: \"es-es\",\n fy: \"fy-nl\",\n ga: \"ga-ie\",\n gu: \"gu-in\",\n hi: \"hi-in\",\n hy: \"hy-am\",\n nb: \"nb-no\",\n ne: \"ne-np\",\n nn: \"nn-no\",\n pa: \"pa-in\",\n pt: \"pt-pt\",\n sv: \"sv-se\",\n zh: \"zh-cn\",\n };\n return PARTIAL_LANG_CODES[langCode] || langCode;\n }\n\n static #isRTL(lang) {\n const shortCode = lang.split(\"-\", 1)[0];\n return [\"ar\", \"he\", \"fa\", \"ps\", \"ur\"].includes(shortCode);\n }\n}\n\nconst GenericL10n = null;\n\nexport { GenericL10n, L10n };\n","/* Copyright 2017 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/** @typedef {import(\"./interfaces\").IL10n} IL10n */\n\nimport { FeatureTest, fetchData } from \"pdfjs-lib\";\nimport { FluentBundle, FluentResource } from \"fluent-bundle\";\nimport { DOMLocalization } from \"fluent-dom\";\nimport { L10n } from \"./l10n.js\";\n\nfunction PLATFORM() {\n const { isAndroid, isLinux, isMac, isWindows } = FeatureTest.platform;\n if (isLinux) {\n return \"linux\";\n }\n if (isWindows) {\n return \"windows\";\n }\n if (isMac) {\n return \"macos\";\n }\n if (isAndroid) {\n return \"android\";\n }\n return \"other\";\n}\n\nfunction createBundle(lang, text) {\n const resource = new FluentResource(text);\n const bundle = new FluentBundle(lang, {\n functions: { PLATFORM },\n });\n const errors = bundle.addResource(resource);\n if (errors.length) {\n console.error(\"L10n errors\", errors);\n }\n return bundle;\n}\n\n/**\n * @implements {IL10n}\n */\nclass GenericL10n extends L10n {\n constructor(lang) {\n super({ lang });\n\n const generateBundles = !lang\n ? GenericL10n.#generateBundlesFallback.bind(\n GenericL10n,\n this.getLanguage()\n )\n : GenericL10n.#generateBundles.bind(\n GenericL10n,\n \"en-us\",\n this.getLanguage()\n );\n this._setL10n(new DOMLocalization([], generateBundles));\n }\n\n /**\n * Generate the bundles for Fluent.\n * @param {String} defaultLang - The fallback language to use for\n * translations.\n * @param {String} baseLang - The base language to use for translations.\n */\n static async *#generateBundles(defaultLang, baseLang) {\n const { baseURL, paths } = await this.#getPaths();\n\n const langs = [baseLang];\n if (defaultLang !== baseLang) {\n // Also fallback to the short-format of the base language\n // (see issue 17269).\n const shortLang = baseLang.split(\"-\", 1)[0];\n\n if (shortLang !== baseLang) {\n langs.push(shortLang);\n }\n langs.push(defaultLang);\n }\n // Trigger fetching of bundles in parallel, to reduce overall load time.\n const bundles = langs.map(lang => [\n lang,\n this.#createBundle(lang, baseURL, paths),\n ]);\n\n for (const [lang, bundlePromise] of bundles) {\n const bundle = await bundlePromise;\n if (bundle) {\n yield bundle;\n } else if (lang === \"en-us\") {\n yield this.#createBundleFallback(lang);\n }\n }\n }\n\n static async #createBundle(lang, baseURL, paths) {\n const path = paths[lang];\n if (!path) {\n return null;\n }\n const url = new URL(path, baseURL);\n const text = await fetchData(url, /* type = */ \"text\");\n\n return createBundle(lang, text);\n }\n\n static async #getPaths() {\n try {\n const { href } = document.querySelector(`link[type=\"application/l10n\"]`);\n const paths = await fetchData(href, /* type = */ \"json\");\n\n return {\n baseURL: href.substring(0, href.lastIndexOf(\"/\") + 1) || \"./\",\n paths,\n };\n } catch {}\n return { baseURL: \"./\", paths: Object.create(null) };\n }\n\n static async *#generateBundlesFallback(lang) {\n yield this.#createBundleFallback(lang);\n }\n\n static async #createBundleFallback(lang) {\n if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"TESTING\")) {\n throw new Error(\"Not implemented: #createBundleFallback\");\n }\n const text =\n typeof PDFJSDev === \"undefined\"\n ? await fetchData(\n new URL(\"../l10n/en-US/viewer.ftl\", window.location.href),\n /* type = */ \"text\"\n )\n : PDFJSDev.eval(\"DEFAULT_FTL\");\n\n return createBundle(lang, text);\n }\n}\n\nexport { GenericL10n };\n","/* Copyright 2020 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\nimport { getPdfFilenameFromUrl } from \"pdfjs-lib\";\n\nasync function docProperties(pdfDocument) {\n const url = \"\",\n baseUrl = \"\";\n const { info, metadata, contentDispositionFilename, contentLength } =\n await pdfDocument.getMetadata();\n\n return {\n ...info,\n baseURL: baseUrl,\n filesize: contentLength || (await pdfDocument.getDownloadInfo()).length,\n filename: contentDispositionFilename || getPdfFilenameFromUrl(url),\n metadata: metadata?.getRaw(),\n authors: metadata?.get(\"dc:creator\"),\n numPages: pdfDocument.numPages,\n URL: url,\n };\n}\n\nclass GenericScripting {\n constructor(sandboxBundleSrc) {\n this._ready = new Promise((resolve, reject) => {\n const sandbox =\n typeof PDFJSDev === \"undefined\"\n ? import(sandboxBundleSrc) // eslint-disable-line no-unsanitized/method\n : __raw_import__(sandboxBundleSrc);\n sandbox\n .then(pdfjsSandbox => {\n resolve(pdfjsSandbox.QuickJSSandbox());\n })\n .catch(reject);\n });\n }\n\n async createSandbox(data) {\n const sandbox = await this._ready;\n sandbox.create(data);\n }\n\n async dispatchEventInSandbox(event) {\n const sandbox = await this._ready;\n setTimeout(() => sandbox.dispatchEvent(event), 0);\n }\n\n async destroySandbox() {\n const sandbox = await this._ready;\n sandbox.nukeSandbox();\n }\n}\n\nexport { docProperties, GenericScripting };\n","/* Copyright 2025 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\nimport { getUuid } from \"pdfjs-lib\";\n\nconst KEY_STORAGE = \"pdfjs.signature\";\n\nclass SignatureStorage {\n // TODO: Encrypt the data in using a password and add a UI for entering it.\n // We could use the Web Crypto API for this (see https://bradyjoslin.com/blog/encryption-webcrypto/\n // for an example).\n\n #eventBus;\n\n #signatures = null;\n\n #signal = null;\n\n constructor(eventBus, signal) {\n this.#eventBus = eventBus;\n this.#signal = signal;\n }\n\n #save() {\n localStorage.setItem(\n KEY_STORAGE,\n JSON.stringify(Object.fromEntries(this.#signatures))\n );\n }\n\n async getAll() {\n if (this.#signal) {\n window.addEventListener(\n \"storage\",\n ({ key }) => {\n if (key === KEY_STORAGE) {\n this.#signatures = null;\n this.#eventBus?.dispatch(\"storedsignatureschanged\", {\n source: this,\n });\n }\n },\n { signal: this.#signal }\n );\n this.#signal = null;\n }\n if (!this.#signatures) {\n this.#signatures = new Map();\n const data = localStorage.getItem(KEY_STORAGE);\n if (data) {\n for (const [key, value] of Object.entries(JSON.parse(data))) {\n this.#signatures.set(key, value);\n }\n }\n }\n return this.#signatures;\n }\n\n async isFull() {\n // Only allow 5 signatures to be saved.\n return (await this.size()) === 5;\n }\n\n async size() {\n return (await this.getAll()).size;\n }\n\n async create(data) {\n if (await this.isFull()) {\n return null;\n }\n const uuid = getUuid();\n this.#signatures.set(uuid, data);\n this.#save();\n\n return uuid;\n }\n\n async delete(uuid) {\n const signatures = await this.getAll();\n if (!signatures.has(uuid)) {\n return false;\n }\n signatures.delete(uuid);\n this.#save();\n\n return true;\n }\n}\n\nexport { SignatureStorage };\n","/* Copyright 2017 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\nimport { AppOptions } from \"./app_options.js\";\nimport { BaseExternalServices } from \"./external_services.js\";\nimport { BasePreferences } from \"./preferences.js\";\nimport { GenericL10n } from \"./genericl10n.js\";\nimport { GenericScripting } from \"./generic_scripting.js\";\nimport { SignatureStorage } from \"./generic_signature_storage.js\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/genericcom\" shall not be used outside GENERIC build.'\n );\n}\n\nfunction initCom(app) {}\n\nclass Preferences extends BasePreferences {\n async _writeToStorage(prefObj) {\n localStorage.setItem(\"pdfjs.preferences\", JSON.stringify(prefObj));\n }\n\n async _readFromStorage(prefObj) {\n return { prefs: JSON.parse(localStorage.getItem(\"pdfjs.preferences\")) };\n }\n}\n\nclass ExternalServices extends BaseExternalServices {\n async createL10n() {\n return new GenericL10n(AppOptions.get(\"localeProperties\")?.lang);\n }\n\n createScripting() {\n return new GenericScripting(AppOptions.get(\"sandboxBundleSrc\"));\n }\n\n createSignatureStorage(eventBus, signal) {\n return new SignatureStorage(eventBus, signal);\n }\n}\n\nclass MLManager {\n static {\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n this.getFakeMLManager = options => new FakeMLManager(options);\n }\n }\n\n async isEnabledFor(_name) {\n return false;\n }\n\n async deleteModel(_service) {\n return null;\n }\n\n isReady(_name) {\n return false;\n }\n\n guess(_data) {}\n\n toggleService(_name, _enabled) {}\n}\n\nif (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"TESTING\")) {\n // eslint-disable-next-line no-var\n var FakeMLManager = class {\n eventBus = null;\n\n hasProgress = false;\n\n constructor({ enableGuessAltText, enableAltTextModelDownload }) {\n this.enableGuessAltText = enableGuessAltText;\n this.enableAltTextModelDownload = enableAltTextModelDownload;\n }\n\n setEventBus(eventBus, abortSignal) {\n this.eventBus = eventBus;\n }\n\n async isEnabledFor(_name) {\n return this.enableGuessAltText;\n }\n\n async deleteModel(_name) {\n this.enableAltTextModelDownload = false;\n return null;\n }\n\n async loadModel(_name) {}\n\n async downloadModel(_name) {\n // Simulate downloading the model but with progress.\n // The progress can be seen in the new alt-text dialog.\n this.hasProgress = true;\n\n const { promise, resolve } = Promise.withResolvers();\n const total = 1e8;\n const end = 1.5 * total;\n const increment = 5e6;\n let loaded = 0;\n const id = setInterval(() => {\n loaded += increment;\n if (loaded <= end) {\n this.eventBus.dispatch(\"loadaiengineprogress\", {\n source: this,\n detail: {\n total,\n totalLoaded: loaded,\n finished: loaded + increment >= end,\n },\n });\n return;\n }\n clearInterval(id);\n this.hasProgress = false;\n this.enableAltTextModelDownload = true;\n resolve(true);\n }, 900);\n return promise;\n }\n\n isReady(_name) {\n return this.enableAltTextModelDownload;\n }\n\n guess({ request: { data } }) {\n return new Promise(resolve => {\n setTimeout(() => {\n resolve(data ? { output: \"Fake alt text.\" } : { error: true });\n }, 3000);\n });\n }\n\n toggleService(_name, enabled) {\n this.enableGuessAltText = enabled;\n }\n };\n}\n\nexport { ExternalServices, initCom, MLManager, Preferences };\n","/* Copyright 2024 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\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass NewAltTextManager {\n #boundCancel = this.#cancel.bind(this);\n\n #createAutomaticallyButton;\n\n #currentEditor = null;\n\n #cancelButton;\n\n #descriptionContainer;\n\n #dialog;\n\n #disclaimer;\n\n #downloadModel;\n\n #downloadModelDescription;\n\n #eventBus;\n\n #firstTime = false;\n\n #guessedAltText;\n\n #hasAI = null;\n\n #isEditing = null;\n\n #imagePreview;\n\n #imageData;\n\n #isAILoading = false;\n\n #wasAILoading = false;\n\n #learnMore;\n\n #notNowButton;\n\n #overlayManager;\n\n #textarea;\n\n #title;\n\n #uiManager;\n\n #previousAltText = null;\n\n constructor(\n {\n descriptionContainer,\n dialog,\n imagePreview,\n cancelButton,\n disclaimer,\n notNowButton,\n saveButton,\n textarea,\n learnMore,\n errorCloseButton,\n createAutomaticallyButton,\n downloadModel,\n downloadModelDescription,\n title,\n },\n overlayManager,\n eventBus\n ) {\n this.#cancelButton = cancelButton;\n this.#createAutomaticallyButton = createAutomaticallyButton;\n this.#descriptionContainer = descriptionContainer;\n this.#dialog = dialog;\n this.#disclaimer = disclaimer;\n this.#notNowButton = notNowButton;\n this.#imagePreview = imagePreview;\n this.#textarea = textarea;\n this.#learnMore = learnMore;\n this.#title = title;\n this.#downloadModel = downloadModel;\n this.#downloadModelDescription = downloadModelDescription;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n\n dialog.addEventListener(\"close\", this.#close.bind(this));\n dialog.addEventListener(\"contextmenu\", event => {\n if (event.target !== this.#textarea) {\n event.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", this.#boundCancel);\n notNowButton.addEventListener(\"click\", this.#boundCancel);\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n errorCloseButton.addEventListener(\"click\", () => {\n this.#toggleError(false);\n });\n createAutomaticallyButton.addEventListener(\"click\", async () => {\n const checked =\n createAutomaticallyButton.getAttribute(\"aria-pressed\") !== \"true\";\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.ai_generation_check\",\n data: { status: checked },\n });\n\n if (this.#uiManager) {\n this.#uiManager.setPreference(\"enableGuessAltText\", checked);\n await this.#uiManager.mlManager.toggleService(\"altText\", checked);\n }\n this.#toggleGuessAltText(checked, /* isInitial = */ false);\n });\n textarea.addEventListener(\"focus\", () => {\n this.#wasAILoading = this.#isAILoading;\n this.#toggleLoading(false);\n this.#toggleTitleAndDisclaimer();\n });\n textarea.addEventListener(\"blur\", () => {\n if (!textarea.value) {\n this.#toggleLoading(this.#wasAILoading);\n }\n this.#toggleTitleAndDisclaimer();\n });\n textarea.addEventListener(\"input\", () => {\n this.#toggleTitleAndDisclaimer();\n });\n\n eventBus._on(\"enableguessalttext\", ({ value }) => {\n this.#toggleGuessAltText(value, /* isInitial = */ false);\n });\n\n this.#overlayManager.register(dialog);\n\n this.#learnMore.addEventListener(\"click\", () => {\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.info\",\n data: { topic: \"alt_text\" },\n });\n });\n }\n\n #toggleLoading(value) {\n if (!this.#uiManager || this.#isAILoading === value) {\n return;\n }\n this.#isAILoading = value;\n this.#descriptionContainer.classList.toggle(\"loading\", value);\n }\n\n #toggleError(value) {\n if (!this.#uiManager) {\n return;\n }\n this.#dialog.classList.toggle(\"error\", value);\n }\n\n async #toggleGuessAltText(value, isInitial = false) {\n if (!this.#uiManager) {\n return;\n }\n this.#dialog.classList.toggle(\"aiDisabled\", !value);\n this.#createAutomaticallyButton.setAttribute(\"aria-pressed\", value);\n\n if (value) {\n const { altTextLearnMoreUrl } = this.#uiManager.mlManager;\n if (altTextLearnMoreUrl) {\n this.#learnMore.href = altTextLearnMoreUrl;\n }\n this.#mlGuessAltText(isInitial);\n } else {\n this.#toggleLoading(false);\n this.#isAILoading = false;\n this.#toggleTitleAndDisclaimer();\n }\n }\n\n #toggleNotNow() {\n this.#notNowButton.classList.toggle(\"hidden\", !this.#firstTime);\n this.#cancelButton.classList.toggle(\"hidden\", this.#firstTime);\n }\n\n #toggleAI(value) {\n if (!this.#uiManager || this.#hasAI === value) {\n return;\n }\n this.#hasAI = value;\n this.#dialog.classList.toggle(\"noAi\", !value);\n this.#toggleTitleAndDisclaimer();\n }\n\n #toggleTitleAndDisclaimer() {\n // Disclaimer is visible when the AI is loading or the user didn't change\n // the guessed alt text.\n const visible =\n this.#isAILoading ||\n (this.#guessedAltText && this.#guessedAltText === this.#textarea.value);\n this.#disclaimer.hidden = !visible;\n\n // The title changes depending if the text area is empty or not.\n const isEditing = this.#isAILoading || !!this.#textarea.value;\n if (this.#isEditing === isEditing) {\n return;\n }\n this.#isEditing = isEditing;\n this.#title.setAttribute(\n \"data-l10n-id\",\n isEditing\n ? \"pdfjs-editor-new-alt-text-dialog-edit-label\"\n : \"pdfjs-editor-new-alt-text-dialog-add-label\"\n );\n }\n\n async #mlGuessAltText(isInitial) {\n if (this.#isAILoading) {\n // We're still loading the previous guess.\n return;\n }\n\n if (this.#textarea.value) {\n // The user has already set an alt text.\n return;\n }\n\n if (isInitial && this.#previousAltText !== null) {\n // The user has already set an alt text (empty or not).\n return;\n }\n\n this.#guessedAltText = this.#currentEditor.guessedAltText;\n if (this.#previousAltText === null && this.#guessedAltText) {\n // We have a guessed alt text and the user didn't change it.\n this.#addAltText(this.#guessedAltText);\n return;\n }\n\n this.#toggleLoading(true);\n this.#toggleTitleAndDisclaimer();\n\n let hasError = false;\n try {\n // When calling #mlGuessAltText we don't wait for it, so we must take care\n // that the alt text dialog can have been closed before the response is.\n\n const altText = await this.#currentEditor.mlGuessAltText(\n this.#imageData,\n /* updateAltTextData = */ false\n );\n if (altText) {\n this.#guessedAltText = altText;\n this.#wasAILoading = this.#isAILoading;\n if (this.#isAILoading) {\n this.#addAltText(altText);\n }\n }\n } catch (e) {\n console.error(e);\n hasError = true;\n }\n\n this.#toggleLoading(false);\n this.#toggleTitleAndDisclaimer();\n\n if (hasError && this.#uiManager) {\n this.#toggleError(true);\n }\n }\n\n #addAltText(altText) {\n if (!this.#uiManager || this.#textarea.value) {\n return;\n }\n this.#textarea.value = altText;\n this.#toggleTitleAndDisclaimer();\n }\n\n #setProgress() {\n // Show the download model progress.\n this.#downloadModel.classList.toggle(\"hidden\", false);\n\n const callback = async ({ detail: { finished, total, totalLoaded } }) => {\n const ONE_MEGA_BYTES = 1e6;\n // totalLoaded can be greater than total if the download is compressed.\n // So we cheat to avoid any confusion.\n totalLoaded = Math.min(0.99 * total, totalLoaded);\n\n // Update the progress.\n const totalSize = (this.#downloadModelDescription.ariaValueMax =\n Math.round(total / ONE_MEGA_BYTES));\n const downloadedSize = (this.#downloadModelDescription.ariaValueNow =\n Math.round(totalLoaded / ONE_MEGA_BYTES));\n this.#downloadModelDescription.setAttribute(\n \"data-l10n-args\",\n JSON.stringify({ totalSize, downloadedSize })\n );\n if (!finished) {\n return;\n }\n\n // We're done, remove the listener and hide the download model progress.\n this.#eventBus._off(\"loadaiengineprogress\", callback);\n this.#downloadModel.classList.toggle(\"hidden\", true);\n\n this.#toggleAI(true);\n if (!this.#uiManager) {\n return;\n }\n const { mlManager } = this.#uiManager;\n\n // The model has been downloaded, we can now enable the AI service.\n mlManager.toggleService(\"altText\", true);\n this.#toggleGuessAltText(\n await mlManager.isEnabledFor(\"altText\"),\n /* isInitial = */ true\n );\n };\n this.#eventBus._on(\"loadaiengineprogress\", callback);\n }\n\n async editAltText(uiManager, editor, firstTime) {\n if (this.#currentEditor || !editor) {\n return;\n }\n\n if (firstTime && editor.hasAltTextData()) {\n editor.altTextFinish();\n return;\n }\n\n this.#firstTime = firstTime;\n let { mlManager } = uiManager;\n let hasAI = !!mlManager;\n this.#toggleTitleAndDisclaimer();\n\n if (mlManager && !mlManager.isReady(\"altText\")) {\n hasAI = false;\n if (mlManager.hasProgress) {\n this.#setProgress();\n } else {\n mlManager = null;\n }\n } else {\n this.#downloadModel.classList.toggle(\"hidden\", true);\n }\n\n const isAltTextEnabledPromise = mlManager?.isEnabledFor(\"altText\");\n\n this.#currentEditor = editor;\n this.#uiManager = uiManager;\n this.#uiManager.removeEditListeners();\n\n ({ altText: this.#previousAltText } = editor.altTextData);\n this.#textarea.value = this.#previousAltText ?? \"\";\n\n // TODO: get this value from Firefox\n // (https://bugzilla.mozilla.org/show_bug.cgi?id=1908184)\n const AI_MAX_IMAGE_DIMENSION = 224;\n const MAX_PREVIEW_DIMENSION = 180;\n\n // The max dimension of the preview in the dialog is 180px, so we keep 224px\n // and rescale it thanks to css.\n\n let canvas, width, height;\n if (mlManager) {\n ({\n canvas,\n width,\n height,\n imageData: this.#imageData,\n } = editor.copyCanvas(\n AI_MAX_IMAGE_DIMENSION,\n MAX_PREVIEW_DIMENSION,\n /* createImageData = */ true\n ));\n if (hasAI) {\n this.#toggleGuessAltText(\n await isAltTextEnabledPromise,\n /* isInitial = */ true\n );\n }\n } else {\n ({ canvas, width, height } = editor.copyCanvas(\n AI_MAX_IMAGE_DIMENSION,\n MAX_PREVIEW_DIMENSION,\n /* createImageData = */ false\n ));\n }\n\n canvas.setAttribute(\"role\", \"presentation\");\n const { style } = canvas;\n style.width = `${width}px`;\n style.height = `${height}px`;\n this.#imagePreview.append(canvas);\n\n this.#toggleNotNow();\n this.#toggleAI(hasAI);\n this.#toggleError(false);\n\n try {\n await this.#overlayManager.open(this.#dialog);\n } catch (ex) {\n this.#close();\n throw ex;\n }\n }\n\n #cancel() {\n this.#currentEditor.altTextData = {\n cancel: true,\n };\n const altText = this.#textarea.value.trim();\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.dismiss\",\n data: {\n alt_text_type: altText ? \"present\" : \"empty\",\n flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n },\n });\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.image_added\",\n data: { alt_text_modal: true, alt_text_type: \"skipped\" },\n });\n this.#finish();\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n\n #close() {\n const canvas = this.#imagePreview.firstChild;\n canvas.remove();\n canvas.width = canvas.height = 0;\n this.#imageData = null;\n\n this.#toggleLoading(false);\n\n this.#uiManager?.addEditListeners();\n this.#currentEditor.altTextFinish();\n this.#uiManager?.setSelected(this.#currentEditor);\n this.#currentEditor = null;\n this.#uiManager = null;\n }\n\n #extractWords(text) {\n return new Set(\n text\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/gu)\n .filter(x => !!x)\n );\n }\n\n #save() {\n const altText = this.#textarea.value.trim();\n this.#currentEditor.altTextData = {\n altText,\n decorative: false,\n };\n this.#currentEditor.altTextData.guessedAltText = this.#guessedAltText;\n\n if (this.#guessedAltText && this.#guessedAltText !== altText) {\n const guessedWords = this.#extractWords(this.#guessedAltText);\n const words = this.#extractWords(altText);\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.user_edit\",\n data: {\n total_words: guessedWords.size,\n words_removed: guessedWords.difference(words).size,\n words_added: words.difference(guessedWords).size,\n },\n });\n }\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.image_added\",\n data: {\n alt_text_modal: true,\n alt_text_type: altText ? \"present\" : \"empty\",\n },\n });\n\n this.#currentEditor._reportTelemetry({\n action: \"pdfjs.image.alt_text.save\",\n data: {\n alt_text_type: altText ? \"present\" : \"empty\",\n flow: this.#firstTime ? \"image_add\" : \"alt_text_edit\",\n },\n });\n\n this.#finish();\n }\n\n destroy() {\n this.#uiManager = null; // Avoid re-adding the edit listeners.\n this.#finish();\n }\n}\n\nclass ImageAltTextSettings {\n #aiModelSettings;\n\n #createModelButton;\n\n #downloadModelButton;\n\n #dialog;\n\n #eventBus;\n\n #mlManager;\n\n #overlayManager;\n\n #showAltTextDialogButton;\n\n constructor(\n {\n dialog,\n createModelButton,\n aiModelSettings,\n learnMore,\n closeButton,\n deleteModelButton,\n downloadModelButton,\n showAltTextDialogButton,\n },\n overlayManager,\n eventBus,\n mlManager\n ) {\n this.#dialog = dialog;\n this.#aiModelSettings = aiModelSettings;\n this.#createModelButton = createModelButton;\n this.#downloadModelButton = downloadModelButton;\n this.#showAltTextDialogButton = showAltTextDialogButton;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#mlManager = mlManager;\n\n const { altTextLearnMoreUrl } = mlManager;\n if (altTextLearnMoreUrl) {\n learnMore.href = altTextLearnMoreUrl;\n }\n\n dialog.addEventListener(\"contextmenu\", noContextMenu);\n\n createModelButton.addEventListener(\"click\", async e => {\n const checked = this.#togglePref(\"enableGuessAltText\", e);\n await mlManager.toggleService(\"altText\", checked);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_ai_generation_check\",\n data: { status: checked },\n });\n });\n\n showAltTextDialogButton.addEventListener(\"click\", e => {\n const checked = this.#togglePref(\"enableNewAltTextWhenAddingImage\", e);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_edit_alt_text_check\",\n data: { status: checked },\n });\n });\n\n deleteModelButton.addEventListener(\"click\", this.#delete.bind(this, true));\n downloadModelButton.addEventListener(\n \"click\",\n this.#download.bind(this, true)\n );\n\n closeButton.addEventListener(\"click\", this.#finish.bind(this));\n\n learnMore.addEventListener(\"click\", () => {\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.info\",\n data: { topic: \"ai_generation\" },\n });\n });\n\n eventBus._on(\"enablealttextmodeldownload\", ({ value }) => {\n if (value) {\n this.#download(false);\n } else {\n this.#delete(false);\n }\n });\n\n this.#overlayManager.register(dialog);\n }\n\n #reportTelemetry(data) {\n this.#eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data,\n },\n });\n }\n\n async #download(isFromUI = false) {\n if (isFromUI) {\n this.#downloadModelButton.disabled = true;\n const span = this.#downloadModelButton.firstChild;\n span.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-settings-downloading-model-button\"\n );\n\n await this.#mlManager.downloadModel(\"altText\");\n\n span.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-alt-text-settings-download-model-button\"\n );\n\n this.#createModelButton.disabled = false;\n this.#setPref(\"enableGuessAltText\", true);\n this.#mlManager.toggleService(\"altText\", true);\n this.#setPref(\"enableAltTextModelDownload\", true);\n this.#downloadModelButton.disabled = false;\n }\n\n this.#aiModelSettings.classList.toggle(\"download\", false);\n this.#createModelButton.setAttribute(\"aria-pressed\", true);\n }\n\n async #delete(isFromUI = false) {\n if (isFromUI) {\n await this.#mlManager.deleteModel(\"altText\");\n this.#setPref(\"enableGuessAltText\", false);\n this.#setPref(\"enableAltTextModelDownload\", false);\n }\n\n this.#aiModelSettings.classList.toggle(\"download\", true);\n this.#createModelButton.disabled = true;\n this.#createModelButton.setAttribute(\"aria-pressed\", false);\n }\n\n async open({ enableGuessAltText, enableNewAltTextWhenAddingImage }) {\n const { enableAltTextModelDownload } = this.#mlManager;\n this.#createModelButton.disabled = !enableAltTextModelDownload;\n this.#createModelButton.setAttribute(\n \"aria-pressed\",\n enableAltTextModelDownload && enableGuessAltText\n );\n this.#showAltTextDialogButton.setAttribute(\n \"aria-pressed\",\n enableNewAltTextWhenAddingImage\n );\n this.#aiModelSettings.classList.toggle(\n \"download\",\n !enableAltTextModelDownload\n );\n\n await this.#overlayManager.open(this.#dialog);\n this.#reportTelemetry({\n type: \"stamp\",\n action: \"pdfjs.image.alt_text.settings_displayed\",\n });\n }\n\n #togglePref(name, { target }) {\n const checked = target.getAttribute(\"aria-pressed\") !== \"true\";\n this.#setPref(name, checked);\n target.setAttribute(\"aria-pressed\", checked);\n return checked;\n }\n\n #setPref(name, value) {\n this.#eventBus.dispatch(\"setpreference\", {\n source: this,\n name,\n value,\n });\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n}\n\nexport { ImageAltTextSettings, NewAltTextManager };\n","/* Copyright 2023 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\nimport { DOMSVGFactory } from \"pdfjs-lib\";\n\nclass AltTextManager {\n #clickAC = null;\n\n #currentEditor = null;\n\n #cancelButton;\n\n #dialog;\n\n #eventBus;\n\n #hasUsedPointer = false;\n\n #optionDescription;\n\n #optionDecorative;\n\n #overlayManager;\n\n #saveButton;\n\n #textarea;\n\n #uiManager;\n\n #previousAltText = null;\n\n #resizeAC = null;\n\n #svgElement = null;\n\n #rectElement = null;\n\n #container;\n\n #telemetryData = null;\n\n constructor(\n {\n dialog,\n optionDescription,\n optionDecorative,\n textarea,\n cancelButton,\n saveButton,\n },\n container,\n overlayManager,\n eventBus\n ) {\n this.#dialog = dialog;\n this.#optionDescription = optionDescription;\n this.#optionDecorative = optionDecorative;\n this.#textarea = textarea;\n this.#cancelButton = cancelButton;\n this.#saveButton = saveButton;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#container = container;\n\n const onUpdateUIState = this.#updateUIState.bind(this);\n\n dialog.addEventListener(\"close\", this.#close.bind(this));\n dialog.addEventListener(\"contextmenu\", event => {\n if (event.target !== this.#textarea) {\n event.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", this.#finish.bind(this));\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n optionDescription.addEventListener(\"change\", onUpdateUIState);\n optionDecorative.addEventListener(\"change\", onUpdateUIState);\n\n this.#overlayManager.register(dialog);\n }\n\n #createSVGElement() {\n if (this.#svgElement) {\n return;\n }\n\n // We create a mask to add to the dialog backdrop: the idea is to have a\n // darken background everywhere except on the editor to clearly see the\n // picture to describe.\n\n const svgFactory = new DOMSVGFactory();\n const svg = (this.#svgElement = svgFactory.createElement(\"svg\"));\n svg.setAttribute(\"width\", \"0\");\n svg.setAttribute(\"height\", \"0\");\n const defs = svgFactory.createElement(\"defs\");\n svg.append(defs);\n const mask = svgFactory.createElement(\"mask\");\n defs.append(mask);\n mask.setAttribute(\"id\", \"alttext-manager-mask\");\n mask.setAttribute(\"maskContentUnits\", \"objectBoundingBox\");\n let rect = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"white\");\n rect.setAttribute(\"width\", \"1\");\n rect.setAttribute(\"height\", \"1\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n\n rect = this.#rectElement = svgFactory.createElement(\"rect\");\n mask.append(rect);\n rect.setAttribute(\"fill\", \"black\");\n this.#dialog.append(svg);\n }\n\n async editAltText(uiManager, editor) {\n if (this.#currentEditor || !editor) {\n return;\n }\n this.#createSVGElement();\n\n this.#hasUsedPointer = false;\n\n this.#clickAC = new AbortController();\n const clickOpts = { signal: this.#clickAC.signal },\n onClick = this.#onClick.bind(this);\n for (const element of [\n this.#optionDescription,\n this.#optionDecorative,\n this.#textarea,\n this.#saveButton,\n this.#cancelButton,\n ]) {\n element.addEventListener(\"click\", onClick, clickOpts);\n }\n\n const { altText, decorative } = editor.altTextData;\n if (decorative === true) {\n this.#optionDecorative.checked = true;\n this.#optionDescription.checked = false;\n } else {\n this.#optionDecorative.checked = false;\n this.#optionDescription.checked = true;\n }\n this.#previousAltText = this.#textarea.value = altText?.trim() || \"\";\n this.#updateUIState();\n\n this.#currentEditor = editor;\n this.#uiManager = uiManager;\n this.#uiManager.removeEditListeners();\n\n this.#resizeAC = new AbortController();\n this.#eventBus._on(\"resize\", this.#setPosition.bind(this), {\n signal: this.#resizeAC.signal,\n });\n\n try {\n await this.#overlayManager.open(this.#dialog);\n this.#setPosition();\n } catch (ex) {\n this.#close();\n throw ex;\n }\n }\n\n #setPosition() {\n if (!this.#currentEditor) {\n return;\n }\n const dialog = this.#dialog;\n const { style } = dialog;\n const {\n x: containerX,\n y: containerY,\n width: containerW,\n height: containerH,\n } = this.#container.getBoundingClientRect();\n const { innerWidth: windowW, innerHeight: windowH } = window;\n const { width: dialogW, height: dialogH } = dialog.getBoundingClientRect();\n const { x, y, width, height } = this.#currentEditor.getClientDimensions();\n const MARGIN = 10;\n const isLTR = this.#uiManager.direction === \"ltr\";\n\n const xs = Math.max(x, containerX);\n const xe = Math.min(x + width, containerX + containerW);\n const ys = Math.max(y, containerY);\n const ye = Math.min(y + height, containerY + containerH);\n this.#rectElement.setAttribute(\"width\", `${(xe - xs) / windowW}`);\n this.#rectElement.setAttribute(\"height\", `${(ye - ys) / windowH}`);\n this.#rectElement.setAttribute(\"x\", `${xs / windowW}`);\n this.#rectElement.setAttribute(\"y\", `${ys / windowH}`);\n\n let left = null;\n let top = Math.max(y, 0);\n top += Math.min(windowH - (top + dialogH), 0);\n\n if (isLTR) {\n // Prefer to position the dialog \"after\" (so on the right) the editor.\n if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n }\n } else if (x > dialogW + MARGIN) {\n left = x - dialogW - MARGIN;\n } else if (x + width + MARGIN + dialogW < windowW) {\n left = x + width + MARGIN;\n }\n\n if (left === null) {\n top = null;\n left = Math.max(x, 0);\n left += Math.min(windowW - (left + dialogW), 0);\n if (y > dialogH + MARGIN) {\n top = y - dialogH - MARGIN;\n } else if (y + height + MARGIN + dialogH < windowH) {\n top = y + height + MARGIN;\n }\n }\n\n if (top !== null) {\n dialog.classList.add(\"positioned\");\n if (isLTR) {\n style.left = `${left}px`;\n } else {\n style.right = `${windowW - left - dialogW}px`;\n }\n style.top = `${top}px`;\n } else {\n dialog.classList.remove(\"positioned\");\n style.left = \"\";\n style.top = \"\";\n }\n }\n\n #finish() {\n this.#overlayManager.closeIfActive(this.#dialog);\n }\n\n #close() {\n this.#currentEditor._reportTelemetry(\n this.#telemetryData || {\n action: \"alt_text_cancel\",\n alt_text_keyboard: !this.#hasUsedPointer,\n }\n );\n this.#telemetryData = null;\n\n this.#removeOnClickListeners();\n this.#uiManager?.addEditListeners();\n this.#resizeAC?.abort();\n this.#resizeAC = null;\n this.#currentEditor.altTextFinish();\n this.#currentEditor = null;\n this.#uiManager = null;\n }\n\n #updateUIState() {\n this.#textarea.disabled = this.#optionDecorative.checked;\n }\n\n #save() {\n const altText = this.#textarea.value.trim();\n const decorative = this.#optionDecorative.checked;\n this.#currentEditor.altTextData = {\n altText,\n decorative,\n };\n this.#telemetryData = {\n action: \"alt_text_save\",\n alt_text_description: !!altText,\n alt_text_edit:\n !!this.#previousAltText && this.#previousAltText !== altText,\n alt_text_decorative: decorative,\n alt_text_keyboard: !this.#hasUsedPointer,\n };\n this.#finish();\n }\n\n #onClick(evt) {\n if (evt.detail === 0) {\n return; // The keyboard was used.\n }\n this.#hasUsedPointer = true;\n this.#removeOnClickListeners();\n }\n\n #removeOnClickListeners() {\n this.#clickAC?.abort();\n this.#clickAC = null;\n }\n\n destroy() {\n this.#uiManager = null; // Avoid re-adding the edit listeners.\n this.#finish();\n this.#svgElement?.remove();\n this.#svgElement = this.#rectElement = null;\n }\n}\n\nexport { AltTextManager };\n","/* Copyright 2022 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/** @typedef {import(\"./event_utils.js\").EventBus} EventBus */\n\nimport { AnnotationEditorParamsType } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} AnnotationEditorParamsOptions\n * @property {HTMLInputElement} editorFreeTextFontSize\n * @property {HTMLInputElement} editorFreeTextColor\n * @property {HTMLInputElement} editorInkColor\n * @property {HTMLInputElement} editorInkThickness\n * @property {HTMLInputElement} editorInkOpacity\n * @property {HTMLButtonElement} editorStampAddImage\n * @property {HTMLInputElement} editorFreeHighlightThickness\n * @property {HTMLButtonElement} editorHighlightShowAll\n * @property {HTMLButtonElement} editorSignatureAddSignature\n */\n\nclass AnnotationEditorParams {\n /**\n * @param {AnnotationEditorParamsOptions} options\n * @param {EventBus} eventBus\n */\n constructor(options, eventBus) {\n this.eventBus = eventBus;\n this.#bindListeners(options);\n }\n\n /**\n * @param {AnnotationEditorParamsOptions} options\n */\n #bindListeners({\n editorFreeTextFontSize,\n editorFreeTextColor,\n editorInkColor,\n editorInkThickness,\n editorInkOpacity,\n editorStampAddImage,\n editorFreeHighlightThickness,\n editorHighlightShowAll,\n editorSignatureAddSignature,\n }) {\n const { eventBus } = this;\n\n const dispatchEvent = (typeStr, value) => {\n eventBus.dispatch(\"switchannotationeditorparams\", {\n source: this,\n type: AnnotationEditorParamsType[typeStr],\n value,\n });\n };\n editorFreeTextFontSize.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_SIZE\", this.valueAsNumber);\n });\n editorFreeTextColor.addEventListener(\"input\", function () {\n dispatchEvent(\"FREETEXT_COLOR\", this.value);\n });\n editorInkColor.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_COLOR\", this.value);\n });\n editorInkThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_THICKNESS\", this.valueAsNumber);\n });\n editorInkOpacity.addEventListener(\"input\", function () {\n dispatchEvent(\"INK_OPACITY\", this.valueAsNumber);\n });\n editorStampAddImage.addEventListener(\"click\", () => {\n eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"editing\",\n data: { action: \"pdfjs.image.add_image_click\" },\n },\n });\n dispatchEvent(\"CREATE\");\n });\n editorFreeHighlightThickness.addEventListener(\"input\", function () {\n dispatchEvent(\"HIGHLIGHT_THICKNESS\", this.valueAsNumber);\n });\n editorHighlightShowAll.addEventListener(\"click\", function () {\n const checked = this.getAttribute(\"aria-pressed\") === \"true\";\n this.setAttribute(\"aria-pressed\", !checked);\n dispatchEvent(\"HIGHLIGHT_SHOW_ALL\", !checked);\n });\n editorSignatureAddSignature.addEventListener(\"click\", () => {\n dispatchEvent(\"CREATE\");\n });\n\n eventBus._on(\"annotationeditorparamschanged\", evt => {\n for (const [type, value] of evt.details) {\n switch (type) {\n case AnnotationEditorParamsType.FREETEXT_SIZE:\n editorFreeTextFontSize.value = value;\n break;\n case AnnotationEditorParamsType.FREETEXT_COLOR:\n editorFreeTextColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_COLOR:\n editorInkColor.value = value;\n break;\n case AnnotationEditorParamsType.INK_THICKNESS:\n editorInkThickness.value = value;\n break;\n case AnnotationEditorParamsType.INK_OPACITY:\n editorInkOpacity.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_COLOR:\n eventBus.dispatch(\"mainhighlightcolorpickerupdatecolor\", {\n source: this,\n value,\n });\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:\n editorFreeHighlightThickness.value = value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_FREE:\n editorFreeHighlightThickness.disabled = !value;\n break;\n case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:\n editorHighlightShowAll.setAttribute(\"aria-pressed\", value);\n break;\n }\n }\n });\n }\n}\n\nexport { AnnotationEditorParams };\n","/* Copyright 2024 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// Used to compare floats: there is no exact equality due to rounding errors.\nconst PRECISION = 1e-1;\n\nclass CaretBrowsingMode {\n #mainContainer;\n\n #toolBarHeight = 0;\n\n #viewerContainer;\n\n constructor(abortSignal, mainContainer, viewerContainer, toolbarContainer) {\n this.#mainContainer = mainContainer;\n this.#viewerContainer = viewerContainer;\n\n if (!toolbarContainer) {\n return;\n }\n this.#toolBarHeight = toolbarContainer.getBoundingClientRect().height;\n\n const toolbarObserver = new ResizeObserver(entries => {\n for (const entry of entries) {\n if (entry.target === toolbarContainer) {\n this.#toolBarHeight = Math.floor(entry.borderBoxSize[0].blockSize);\n break;\n }\n }\n });\n toolbarObserver.observe(toolbarContainer);\n\n abortSignal.addEventListener(\"abort\", () => toolbarObserver.disconnect(), {\n once: true,\n });\n }\n\n /**\n * Return true if the two rectangles are on the same line.\n * @param {DOMRect} rect1\n * @param {DOMRect} rect2\n * @returns {boolean}\n */\n #isOnSameLine(rect1, rect2) {\n const top1 = rect1.y;\n const bot1 = rect1.bottom;\n const mid1 = rect1.y + rect1.height / 2;\n\n const top2 = rect2.y;\n const bot2 = rect2.bottom;\n const mid2 = rect2.y + rect2.height / 2;\n\n return (top1 <= mid2 && mid2 <= bot1) || (top2 <= mid1 && mid1 <= bot2);\n }\n\n /**\n * Return `true` if the rectangle is:\n * - under the caret when `isUp === false`.\n * - over the caret when `isUp === true`.\n * @param {DOMRect} rect\n * @param {number} x\n * @param {number} y\n * @param {boolean} isUp\n * @returns {boolean}\n */\n #isUnderOver(rect, x, y, isUp) {\n const midY = rect.y + rect.height / 2;\n return (\n (isUp ? y >= midY : y <= midY) &&\n rect.x - PRECISION <= x &&\n x <= rect.right + PRECISION\n );\n }\n\n /**\n * Check if the rectangle is visible.\n * @param {DOMRect} rect\n * @returns {boolean}\n */\n #isVisible(rect) {\n return (\n rect.top >= this.#toolBarHeight &&\n rect.left >= 0 &&\n rect.bottom <=\n (window.innerHeight || document.documentElement.clientHeight) &&\n rect.right <= (window.innerWidth || document.documentElement.clientWidth)\n );\n }\n\n /**\n * Get the position of the caret.\n * @param {Selection} selection\n * @param {boolean} isUp\n * @returns {Array}\n */\n #getCaretPosition(selection, isUp) {\n const { focusNode, focusOffset } = selection;\n const range = document.createRange();\n range.setStart(focusNode, focusOffset);\n range.setEnd(focusNode, focusOffset);\n const rect = range.getBoundingClientRect();\n\n return [rect.x, isUp ? rect.top : rect.bottom];\n }\n\n static #caretPositionFromPoint(x, y) {\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"MOZCENTRAL\")) &&\n !document.caretPositionFromPoint\n ) {\n const { startContainer: offsetNode, startOffset: offset } =\n document.caretRangeFromPoint(x, y);\n return { offsetNode, offset };\n }\n return document.caretPositionFromPoint(x, y);\n }\n\n #setCaretPositionHelper(selection, caretX, select, element, rect) {\n rect ||= element.getBoundingClientRect();\n if (caretX <= rect.x + PRECISION) {\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (rect.right - PRECISION <= caretX) {\n const { lastChild } = element;\n if (select) {\n selection.extend(lastChild, lastChild.length);\n } else {\n selection.setPosition(lastChild, lastChild.length);\n }\n return;\n }\n\n const midY = rect.y + rect.height / 2;\n let caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n let parentElement = caretPosition.offsetNode?.parentElement;\n if (parentElement && parentElement !== element) {\n // There is an element on top of the one in the text layer, so we\n // need to hide all the elements (except the one in the text layer)\n // at this position in order to get the correct caret position.\n const elementsAtPoint = document.elementsFromPoint(caretX, midY);\n const savedVisibilities = [];\n for (const el of elementsAtPoint) {\n if (el === element) {\n break;\n }\n const { style } = el;\n savedVisibilities.push([el, style.visibility]);\n style.visibility = \"hidden\";\n }\n caretPosition = CaretBrowsingMode.#caretPositionFromPoint(caretX, midY);\n parentElement = caretPosition.offsetNode?.parentElement;\n for (const [el, visibility] of savedVisibilities) {\n el.style.visibility = visibility;\n }\n }\n if (parentElement !== element) {\n // The element targeted by caretPositionFromPoint isn't in the text\n // layer.\n if (select) {\n selection.extend(element.firstChild, 0);\n } else {\n selection.setPosition(element.firstChild, 0);\n }\n return;\n }\n if (select) {\n selection.extend(caretPosition.offsetNode, caretPosition.offset);\n } else {\n selection.setPosition(caretPosition.offsetNode, caretPosition.offset);\n }\n }\n\n /**\n * Set the caret position or extend the selection (it depends on the select\n * parameter).\n * @param {boolean} select\n * @param {Selection} selection\n * @param {Element} newLineElement\n * @param {DOMRect} newLineElementRect\n * @param {number} caretX\n */\n #setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n ) {\n if (this.#isVisible(newLineElementRect)) {\n this.#setCaretPositionHelper(\n selection,\n caretX,\n select,\n newLineElement,\n newLineElementRect\n );\n return;\n }\n this.#mainContainer.addEventListener(\n \"scrollend\",\n this.#setCaretPositionHelper.bind(\n this,\n selection,\n caretX,\n select,\n newLineElement,\n null\n ),\n { once: true }\n );\n newLineElement.scrollIntoView();\n }\n\n /**\n * Get the node on the next page.\n * @param {Element} textLayer\n * @param {boolean} isUp\n * @returns {Node}\n */\n #getNodeOnNextPage(textLayer, isUp) {\n while (true) {\n const page = textLayer.closest(\".page\");\n const pageNumber = parseInt(page.getAttribute(\"data-page-number\"));\n const nextPage = isUp ? pageNumber - 1 : pageNumber + 1;\n textLayer = this.#viewerContainer.querySelector(\n `.page[data-page-number=\"${nextPage}\"] .textLayer`\n );\n if (!textLayer) {\n return null;\n }\n const walker = document.createTreeWalker(textLayer, NodeFilter.SHOW_TEXT);\n const node = isUp ? walker.lastChild() : walker.firstChild();\n if (node) {\n return node;\n }\n }\n }\n\n /**\n * Move the caret in the given direction.\n * @param {boolean} isUp\n * @param {boolean} select\n */\n moveCaret(isUp, select) {\n const selection = document.getSelection();\n if (selection.rangeCount === 0) {\n return;\n }\n const { focusNode } = selection;\n const focusElement =\n focusNode.nodeType !== Node.ELEMENT_NODE\n ? focusNode.parentElement\n : focusNode;\n const root = focusElement.closest(\".textLayer\");\n if (!root) {\n return;\n }\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n walker.currentNode = focusNode;\n\n // Move to the next element which is not on the same line as the focus\n // element.\n const focusRect = focusElement.getBoundingClientRect();\n let newLineElement = null;\n const nodeIterator = (\n isUp ? walker.previousSibling : walker.nextSibling\n ).bind(walker);\n while (nodeIterator()) {\n const element = walker.currentNode.parentElement;\n if (!this.#isOnSameLine(focusRect, element.getBoundingClientRect())) {\n newLineElement = element;\n break;\n }\n }\n\n if (!newLineElement) {\n // Need to find the next line on the next page.\n const node = this.#getNodeOnNextPage(root, isUp);\n if (!node) {\n return;\n }\n if (select) {\n const lastNode =\n (isUp ? walker.firstChild() : walker.lastChild()) || focusNode;\n selection.extend(lastNode, isUp ? 0 : lastNode.length);\n const range = document.createRange();\n range.setStart(node, isUp ? node.length : 0);\n range.setEnd(node, isUp ? node.length : 0);\n selection.addRange(range);\n return;\n }\n const [caretX] = this.#getCaretPosition(selection, isUp);\n const { parentElement } = node;\n this.#setCaretPosition(\n select,\n selection,\n parentElement,\n parentElement.getBoundingClientRect(),\n caretX\n );\n return;\n }\n\n // We've a candidate for the next line now we want to find the first element\n // which is under/over the caret.\n const [caretX, caretY] = this.#getCaretPosition(selection, isUp);\n const newLineElementRect = newLineElement.getBoundingClientRect();\n\n // Maybe the element on the new line is a valid candidate.\n if (this.#isUnderOver(newLineElementRect, caretX, caretY, isUp)) {\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n return;\n }\n\n while (nodeIterator()) {\n // Search an element on the same line as newLineElement\n // which could be under/over the caret.\n const element = walker.currentNode.parentElement;\n const elementRect = element.getBoundingClientRect();\n if (!this.#isOnSameLine(newLineElementRect, elementRect)) {\n break;\n }\n if (this.#isUnderOver(elementRect, caretX, caretY, isUp)) {\n // We found the element.\n this.#setCaretPosition(select, selection, element, elementRect, caretX);\n return;\n }\n }\n\n // No element has been found so just put the caret on the element on the new\n // line.\n this.#setCaretPosition(\n select,\n selection,\n newLineElement,\n newLineElementRect,\n caretX\n );\n }\n}\n\nexport { CaretBrowsingMode };\n","/* Copyright 2025 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\nimport {\n AnnotationEditorType,\n applyOpacity,\n CSSConstants,\n findContrastColor,\n MathClamp,\n noContextMenu,\n PDFDateString,\n renderRichText,\n shadow,\n stopEvent,\n Util,\n} from \"pdfjs-lib\";\nimport { binarySearchFirstItem } from \"./ui_utils.js\";\n\nclass CommentManager {\n #dialog;\n\n #popup;\n\n #sidebar;\n\n static #hasForcedColors = null;\n\n constructor(\n commentDialog,\n sidebar,\n eventBus,\n linkService,\n overlayManager,\n ltr,\n hasForcedColors\n ) {\n const dateFormat = new Intl.DateTimeFormat(undefined, {\n dateStyle: \"long\",\n });\n this.dialogElement = commentDialog.dialog;\n this.#dialog = new CommentDialog(\n commentDialog,\n overlayManager,\n eventBus,\n ltr\n );\n this.#popup = new CommentPopup(\n eventBus,\n dateFormat,\n ltr,\n this.dialogElement\n );\n this.#sidebar = new CommentSidebar(\n sidebar,\n eventBus,\n linkService,\n this.#popup,\n dateFormat,\n ltr\n );\n this.#popup.sidebar = this.#sidebar;\n CommentManager.#hasForcedColors = hasForcedColors;\n }\n\n setSidebarUiManager(uiManager) {\n this.#sidebar.setUIManager(uiManager);\n }\n\n showSidebar(annotations) {\n this.#sidebar.show(annotations);\n }\n\n hideSidebar() {\n this.#sidebar.hide();\n }\n\n removeComments(ids) {\n this.#sidebar.removeComments(ids);\n }\n\n selectComment(id) {\n this.#sidebar.selectComment(null, id);\n }\n\n addComment(annotation) {\n this.#sidebar.addComment(annotation);\n }\n\n updateComment(annotation) {\n this.#sidebar.updateComment(annotation);\n }\n\n toggleCommentPopup(editor, isSelected, visibility, isEditable) {\n if (isSelected) {\n this.selectComment(editor.uid);\n }\n this.#popup.toggle(editor, isSelected, visibility, isEditable);\n }\n\n destroyPopup() {\n this.#popup.destroy();\n }\n\n updatePopupColor(editor) {\n this.#popup.updateColor(editor);\n }\n\n showDialog(uiManager, editor, posX, posY, options) {\n return this.#dialog.open(uiManager, editor, posX, posY, options);\n }\n\n makeCommentColor(color, opacity) {\n return CommentManager._makeCommentColor(color, opacity);\n }\n\n static _makeCommentColor(color, opacity) {\n return this.#hasForcedColors\n ? null\n : findContrastColor(\n applyOpacity(...color, opacity ?? 1),\n CSSConstants.commentForegroundColor\n );\n }\n\n destroy() {\n this.#dialog.destroy();\n this.#sidebar.hide();\n this.#popup.destroy();\n }\n}\n\nclass CommentSidebar {\n #annotations = null;\n\n #eventBus;\n\n #boundCommentClick = this.#commentClick.bind(this);\n\n #boundCommentKeydown = this.#commentKeydown.bind(this);\n\n #sidebar;\n\n #closeButton;\n\n #commentsList;\n\n #commentCount;\n\n #dateFormat;\n\n #sidebarTitle;\n\n #learnMoreUrl;\n\n #linkService;\n\n #popup;\n\n #elementsToAnnotations = null;\n\n #idsToElements = null;\n\n #uiManager = null;\n\n #minWidth = 0;\n\n #maxWidth = 0;\n\n #initialWidth = 0;\n\n #width = 0;\n\n #ltr;\n\n constructor(\n {\n learnMoreUrl,\n sidebar,\n sidebarResizer,\n commentsList,\n commentCount,\n sidebarTitle,\n closeButton,\n commentToolbarButton,\n },\n eventBus,\n linkService,\n popup,\n dateFormat,\n ltr\n ) {\n this.#sidebar = sidebar;\n this.#sidebarTitle = sidebarTitle;\n this.#commentsList = commentsList;\n this.#commentCount = commentCount;\n this.#learnMoreUrl = learnMoreUrl;\n this.#linkService = linkService;\n this.#closeButton = closeButton;\n this.#popup = popup;\n this.#dateFormat = dateFormat;\n this.#ltr = ltr;\n this.#eventBus = eventBus;\n\n const style = window.getComputedStyle(sidebar);\n this.#minWidth = parseFloat(style.getPropertyValue(\"--sidebar-min-width\"));\n this.#maxWidth = parseFloat(style.getPropertyValue(\"--sidebar-max-width\"));\n this.#initialWidth = this.#width = parseFloat(\n style.getPropertyValue(\"--sidebar-width\")\n );\n\n this.#makeSidebarResizable(sidebarResizer);\n closeButton.addEventListener(\"click\", () => {\n eventBus.dispatch(\"switchannotationeditormode\", {\n source: this,\n mode: AnnotationEditorType.NONE,\n });\n });\n const keyDownCallback = e => {\n if (e.key === \"ArrowDown\" || e.key === \"Home\" || e.key === \"F6\") {\n this.#commentsList.firstElementChild.focus();\n stopEvent(e);\n } else if (e.key === \"ArrowUp\" || e.key === \"End\") {\n this.#commentsList.lastElementChild.focus();\n stopEvent(e);\n }\n };\n commentToolbarButton.addEventListener(\"keydown\", keyDownCallback);\n sidebar.addEventListener(\"keydown\", keyDownCallback);\n this.#sidebar.hidden = true;\n }\n\n #makeSidebarResizable(resizer) {\n let pointerMoveAC;\n const cancelResize = () => {\n this.#width = MathClamp(this.#width, this.#minWidth, this.#maxWidth);\n this.#sidebar.classList.remove(\"resizing\");\n pointerMoveAC?.abort();\n pointerMoveAC = null;\n };\n resizer.addEventListener(\"pointerdown\", e => {\n if (pointerMoveAC) {\n cancelResize();\n return;\n }\n const { clientX } = e;\n stopEvent(e);\n let prevX = clientX;\n pointerMoveAC = new AbortController();\n const { signal } = pointerMoveAC;\n const sign = this.#ltr ? -1 : 1;\n const sidebar = this.#sidebar;\n const sidebarStyle = sidebar.style;\n sidebar.classList.add(\"resizing\");\n const parentStyle = sidebar.parentElement.style;\n parentStyle.minWidth = 0;\n window.addEventListener(\"contextmenu\", noContextMenu, { signal });\n window.addEventListener(\n \"pointermove\",\n ev => {\n if (!pointerMoveAC) {\n return;\n }\n stopEvent(ev);\n const { clientX: x } = ev;\n const newWidth = (this.#width += sign * (x - prevX));\n prevX = x;\n if (newWidth > this.#maxWidth || newWidth < this.#minWidth) {\n return;\n }\n sidebarStyle.width = `${newWidth.toFixed(3)}px`;\n parentStyle.insetInlineStart = `${(this.#initialWidth - newWidth).toFixed(3)}px`;\n },\n { signal, capture: true }\n );\n window.addEventListener(\"blur\", cancelResize, { signal });\n window.addEventListener(\n \"pointerup\",\n ev => {\n if (pointerMoveAC) {\n cancelResize();\n stopEvent(ev);\n }\n },\n { signal }\n );\n });\n }\n\n setUIManager(uiManager) {\n this.#uiManager = uiManager;\n }\n\n show(annotations) {\n this.#elementsToAnnotations = new WeakMap();\n this.#idsToElements = new Map();\n this.#annotations = annotations;\n annotations.sort(this.#sortComments.bind(this));\n if (annotations.length !== 0) {\n const fragment = document.createDocumentFragment();\n for (const annotation of annotations) {\n fragment.append(this.#createCommentElement(annotation));\n }\n\n this.#setCommentsCount(fragment);\n this.#commentsList.append(fragment);\n } else {\n this.#setCommentsCount();\n }\n this.#sidebar.hidden = false;\n this.#eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"commentSidebar\",\n data: { numberOfAnnotations: annotations.length },\n },\n });\n }\n\n hide() {\n this.#sidebar.hidden = true;\n this.#commentsList.replaceChildren();\n this.#elementsToAnnotations = null;\n this.#idsToElements = null;\n this.#annotations = null;\n }\n\n removeComments(ids) {\n if (ids.length === 0 || !this.#idsToElements) {\n return;\n }\n if (\n new Set(this.#idsToElements.keys()).difference(new Set(ids)).size === 0\n ) {\n this.#removeAll();\n return;\n }\n for (const id of ids) {\n this.#removeComment(id);\n }\n }\n\n focusComment(id) {\n const element = this.#idsToElements.get(id);\n if (!element) {\n return;\n }\n this.#sidebar.scrollTop = element.offsetTop - this.#sidebar.offsetTop;\n for (const el of this.#commentsList.children) {\n el.classList.toggle(\"selected\", el === element);\n }\n }\n\n updateComment(annotation) {\n if (!this.#idsToElements) {\n return;\n }\n const {\n id,\n creationDate,\n modificationDate,\n richText,\n contentsObj,\n popupRef,\n } = annotation;\n\n if (!popupRef || (!richText && !contentsObj?.str)) {\n this.#removeComment(id);\n }\n\n const element = this.#idsToElements.get(id);\n if (!element) {\n return;\n }\n const prevAnnotation = this.#elementsToAnnotations.get(element);\n let index = binarySearchFirstItem(\n this.#annotations,\n a => this.#sortComments(a, prevAnnotation) >= 0\n );\n if (index >= this.#annotations.length) {\n return;\n }\n\n this.#setDate(element.firstChild, modificationDate || creationDate);\n this.#setText(element.lastChild, richText, contentsObj);\n\n this.#annotations.splice(index, 1);\n index = binarySearchFirstItem(\n this.#annotations,\n a => this.#sortComments(a, annotation) >= 0\n );\n this.#annotations.splice(index, 0, annotation);\n if (index >= this.#commentsList.children.length) {\n this.#commentsList.append(element);\n } else {\n this.#commentsList.insertBefore(\n element,\n this.#commentsList.children[index]\n );\n }\n }\n\n #removeComment(id) {\n const element = this.#idsToElements?.get(id);\n if (!element) {\n return;\n }\n const annotation = this.#elementsToAnnotations.get(element);\n const index = binarySearchFirstItem(\n this.#annotations,\n a => this.#sortComments(a, annotation) >= 0\n );\n if (index >= this.#annotations.length) {\n return;\n }\n this.#annotations.splice(index, 1);\n element.remove();\n this.#idsToElements.delete(id);\n this.#setCommentsCount();\n }\n\n #removeAll() {\n this.#commentsList.replaceChildren();\n this.#elementsToAnnotations = new WeakMap();\n this.#idsToElements.clear();\n this.#annotations.length = 0;\n this.#setCommentsCount();\n }\n\n selectComment(element, id = null) {\n if (!this.#idsToElements) {\n return;\n }\n const hasNoElement = !element;\n element ||= this.#idsToElements.get(id);\n for (const el of this.#commentsList.children) {\n el.classList.toggle(\"selected\", el === element);\n }\n if (hasNoElement) {\n element?.scrollIntoView({ behavior: \"instant\", block: \"center\" });\n }\n }\n\n addComment(annotation) {\n if (this.#idsToElements?.has(annotation.id)) {\n return;\n }\n const { popupRef, contentsObj } = annotation;\n if (!popupRef || !contentsObj?.str) {\n return;\n }\n const commentItem = this.#createCommentElement(annotation);\n if (this.#annotations.length === 0) {\n this.#commentsList.replaceChildren(commentItem);\n this.#annotations.push(annotation);\n this.#setCommentsCount();\n return;\n }\n const index = binarySearchFirstItem(\n this.#annotations,\n a => this.#sortComments(a, annotation) >= 0\n );\n this.#annotations.splice(index, 0, annotation);\n if (index >= this.#commentsList.children.length) {\n this.#commentsList.append(commentItem);\n } else {\n this.#commentsList.insertBefore(\n commentItem,\n this.#commentsList.children[index]\n );\n }\n this.#setCommentsCount();\n }\n\n #setCommentsCount(container = this.#commentsList) {\n const count = this.#idsToElements.size;\n this.#sidebarTitle.setAttribute(\n \"data-l10n-args\",\n JSON.stringify({ count })\n );\n this.#commentCount.textContent = count;\n if (count === 0) {\n container.append(this.#createZeroCommentElement());\n }\n }\n\n #createZeroCommentElement() {\n const commentItem = document.createElement(\"li\");\n commentItem.classList.add(\"sidebarComment\", \"noComments\");\n const textDiv = document.createElement(\"div\");\n textDiv.className = \"sidebarCommentText\";\n textDiv.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-comments-sidebar-no-comments1\"\n );\n commentItem.append(textDiv);\n if (this.#learnMoreUrl) {\n const a = document.createElement(\"a\");\n a.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-comments-sidebar-no-comments-link\"\n );\n a.href = this.#learnMoreUrl;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n commentItem.append(a);\n }\n return commentItem;\n }\n\n #setDate(element, date) {\n date = PDFDateString.toDateObject(date);\n element.dateTime = date.toISOString();\n element.textContent = this.#dateFormat.format(date);\n }\n\n #setText(element, richText, contentsObj) {\n element.replaceChildren();\n const html =\n richText?.str && (!contentsObj?.str || richText.str === contentsObj.str)\n ? richText.html\n : contentsObj?.str;\n renderRichText(\n {\n html,\n dir: contentsObj?.dir || \"auto\",\n className: \"richText\",\n },\n element\n );\n }\n\n #createCommentElement(annotation) {\n const {\n id,\n creationDate,\n modificationDate,\n richText,\n contentsObj,\n color,\n opacity,\n } = annotation;\n const commentItem = document.createElement(\"li\");\n commentItem.role = \"button\";\n commentItem.className = \"sidebarComment\";\n commentItem.tabIndex = -1;\n commentItem.style.backgroundColor =\n (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n const dateDiv = document.createElement(\"time\");\n this.#setDate(dateDiv, modificationDate || creationDate);\n\n const textDiv = document.createElement(\"div\");\n textDiv.className = \"sidebarCommentText\";\n this.#setText(textDiv, richText, contentsObj);\n\n commentItem.append(dateDiv, textDiv);\n commentItem.addEventListener(\"click\", this.#boundCommentClick);\n commentItem.addEventListener(\"keydown\", this.#boundCommentKeydown);\n\n this.#elementsToAnnotations.set(commentItem, annotation);\n this.#idsToElements.set(id, commentItem);\n return commentItem;\n }\n\n async #commentClick({ currentTarget }) {\n if (currentTarget.classList.contains(\"selected\")) {\n currentTarget.classList.remove(\"selected\");\n this.#popup._hide();\n return;\n }\n const annotation = this.#elementsToAnnotations.get(currentTarget);\n if (!annotation) {\n return;\n }\n this.#popup._hide();\n const { id, pageIndex, rect } = annotation;\n const pageNumber = pageIndex + 1;\n const pageVisiblePromise =\n this.#uiManager?.waitForEditorsRendered(pageNumber);\n this.#linkService?.goToXY(pageNumber, rect[0], rect[3], {\n center: \"both\",\n });\n this.selectComment(currentTarget);\n await pageVisiblePromise;\n this.#uiManager?.selectComment(pageIndex, id);\n }\n\n #commentKeydown(e) {\n const { key, currentTarget } = e;\n switch (key) {\n case \"ArrowDown\":\n (\n currentTarget.nextElementSibling ||\n this.#commentsList.firstElementChild\n ).focus();\n stopEvent(e);\n break;\n case \"ArrowUp\":\n (\n currentTarget.previousElementSibling ||\n this.#commentsList.lastElementChild\n ).focus();\n stopEvent(e);\n break;\n case \"Home\":\n this.#commentsList.firstElementChild.focus();\n stopEvent(e);\n break;\n case \"End\":\n this.#commentsList.lastElementChild.focus();\n stopEvent(e);\n break;\n case \"Enter\":\n case \" \":\n this.#commentClick(e);\n stopEvent(e);\n break;\n case \"ShiftTab\":\n this.#closeButton.focus();\n stopEvent(e);\n break;\n }\n }\n\n #sortComments(a, b) {\n const dateA = PDFDateString.toDateObject(\n a.modificationDate || a.creationDate\n );\n const dateB = PDFDateString.toDateObject(\n b.modificationDate || b.creationDate\n );\n if (dateA !== dateB) {\n if (dateA !== null && dateB !== null) {\n return dateB - dateA;\n }\n return dateA !== null ? -1 : 1;\n }\n if (a.pageIndex !== b.pageIndex) {\n return a.pageIndex - b.pageIndex;\n }\n if (a.rect[3] !== b.rect[3]) {\n return b.rect[3] - a.rect[3];\n }\n if (a.rect[0] !== b.rect[0]) {\n return a.rect[0] - b.rect[0];\n }\n if (a.rect[1] !== b.rect[1]) {\n return b.rect[1] - a.rect[1];\n }\n if (a.rect[2] !== b.rect[2]) {\n return a.rect[2] - b.rect[2];\n }\n return a.id.localeCompare(b.id);\n }\n}\n\nclass CommentDialog {\n #dialog;\n\n #editor;\n\n #overlayManager;\n\n #previousText = \"\";\n\n #commentText = \"\";\n\n #textInput;\n\n #title;\n\n #saveButton;\n\n #uiManager;\n\n #prevDragX = 0;\n\n #prevDragY = 0;\n\n #dialogX = 0;\n\n #dialogY = 0;\n\n #isLTR;\n\n #eventBus;\n\n constructor(\n { dialog, toolbar, title, textInput, cancelButton, saveButton },\n overlayManager,\n eventBus,\n ltr\n ) {\n this.#dialog = dialog;\n this.#textInput = textInput;\n this.#overlayManager = overlayManager;\n this.#eventBus = eventBus;\n this.#saveButton = saveButton;\n this.#title = title;\n this.#isLTR = ltr;\n\n const finishBound = this.#finish.bind(this);\n dialog.addEventListener(\"close\", finishBound);\n dialog.addEventListener(\"contextmenu\", e => {\n if (e.target !== this.#textInput) {\n e.preventDefault();\n }\n });\n cancelButton.addEventListener(\"click\", finishBound);\n saveButton.addEventListener(\"click\", this.#save.bind(this));\n\n textInput.addEventListener(\"input\", () => {\n saveButton.disabled = textInput.value === this.#previousText;\n });\n\n // Make the dialog draggable.\n let pointerMoveAC;\n const cancelDrag = () => {\n dialog.classList.remove(\"dragging\");\n pointerMoveAC?.abort();\n pointerMoveAC = null;\n };\n toolbar.addEventListener(\"pointerdown\", e => {\n if (pointerMoveAC) {\n cancelDrag();\n return;\n }\n const { clientX, clientY } = e;\n stopEvent(e);\n this.#prevDragX = clientX;\n this.#prevDragY = clientY;\n pointerMoveAC = new AbortController();\n const { signal } = pointerMoveAC;\n const { innerHeight, innerWidth } = window;\n dialog.classList.add(\"dragging\");\n window.addEventListener(\n \"pointermove\",\n ev => {\n if (!pointerMoveAC) {\n return;\n }\n const { clientX: x, clientY: y } = ev;\n this.#setPosition(\n this.#dialogX + (x - this.#prevDragX) / innerWidth,\n this.#dialogY + (y - this.#prevDragY) / innerHeight\n );\n this.#prevDragX = x;\n this.#prevDragY = y;\n stopEvent(ev);\n },\n { signal }\n );\n window.addEventListener(\"blur\", cancelDrag, { signal });\n window.addEventListener(\n \"pointerup\",\n ev => {\n if (pointerMoveAC) {\n cancelDrag();\n stopEvent(ev);\n }\n },\n { signal }\n );\n });\n\n overlayManager.register(dialog);\n }\n\n async open(uiManager, editor, posX, posY, options) {\n if (editor) {\n this.#uiManager = uiManager;\n this.#editor = editor;\n }\n const {\n contentsObj: { str },\n color,\n opacity,\n } = editor.getData();\n const { style: dialogStyle } = this.#dialog;\n if (color) {\n dialogStyle.backgroundColor = CommentManager._makeCommentColor(\n color,\n opacity\n );\n dialogStyle.borderColor = Util.makeHexColor(...color);\n } else {\n dialogStyle.backgroundColor = dialogStyle.borderColor = \"\";\n }\n this.#commentText = str || \"\";\n const textInput = this.#textInput;\n textInput.value = this.#previousText = this.#commentText;\n if (str) {\n this.#title.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-edit-comment-dialog-title-when-editing\"\n );\n this.#saveButton.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-edit-comment-dialog-save-button-when-editing\"\n );\n } else {\n this.#title.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-edit-comment-dialog-title-when-adding\"\n );\n this.#saveButton.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-edit-comment-dialog-save-button-when-adding\"\n );\n }\n if (options?.height) {\n textInput.style.height = `${options.height}px`;\n }\n this.#uiManager?.removeEditListeners();\n this.#saveButton.disabled = true;\n const parentDimensions = options?.parentDimensions;\n const { innerHeight, innerWidth } = window;\n if (editor.hasDefaultPopupPosition()) {\n const { dialogWidth, dialogHeight } = this._dialogDimensions;\n if (parentDimensions) {\n if (\n this.#isLTR &&\n posX + dialogWidth >\n Math.min(parentDimensions.x + parentDimensions.width, innerWidth)\n ) {\n const buttonWidth = this.#editor.commentButtonWidth;\n posX -= dialogWidth - buttonWidth * parentDimensions.width;\n } else if (!this.#isLTR) {\n const buttonWidth =\n this.#editor.commentButtonWidth * parentDimensions.width;\n if (posX - dialogWidth < Math.max(0, parentDimensions.x)) {\n posX = Math.max(0, posX);\n } else {\n posX -= dialogWidth - buttonWidth;\n }\n }\n }\n const height = Math.max(dialogHeight, options?.height || 0);\n if (posY + height > innerHeight) {\n posY = innerHeight - height;\n }\n if (posY < 0) {\n posY = 0;\n }\n }\n\n posX = MathClamp(posX / innerWidth, 0, 1);\n posY = MathClamp(posY / innerHeight, 0, 1);\n this.#setPosition(posX, posY);\n\n await this.#overlayManager.open(this.#dialog);\n textInput.focus();\n }\n\n async #save() {\n this.#editor.comment = this.#textInput.value;\n this.#finish();\n }\n\n get _dialogDimensions() {\n const dialog = this.#dialog;\n const { style } = dialog;\n style.opacity = \"0\";\n style.display = \"block\";\n const { width, height } = dialog.getBoundingClientRect();\n style.opacity = style.display = \"\";\n return shadow(this, \"_dialogDimensions\", {\n dialogWidth: width,\n dialogHeight: height,\n });\n }\n\n #setPosition(x, y) {\n this.#dialogX = x;\n this.#dialogY = y;\n const { style } = this.#dialog;\n style.left = `${100 * x}%`;\n style.top = `${100 * y}%`;\n }\n\n #finish() {\n if (!this.#editor) {\n return;\n }\n const edited = this.#textInput.value !== this.#commentText;\n this.#eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"comment\",\n data: {\n edited,\n },\n },\n });\n\n this.#editor?.focusCommentButton();\n this.#editor = null;\n this.#textInput.value = this.#previousText = this.#commentText = \"\";\n this.#overlayManager.closeIfActive(this.#dialog);\n this.#textInput.style.height = \"\";\n this.#uiManager?.addEditListeners();\n this.#uiManager = null;\n }\n\n destroy() {\n this.#uiManager = null;\n this.#editor = null;\n this.#finish();\n }\n}\n\nclass CommentPopup {\n #buttonsContainer = null;\n\n #eventBus;\n\n #commentDialog;\n\n #dateFormat;\n\n #editor = null;\n\n #isLTR;\n\n #container = null;\n\n #text = null;\n\n #time = null;\n\n #prevDragX = 0;\n\n #prevDragY = 0;\n\n #posX = 0;\n\n #posY = 0;\n\n #previousFocusedElement = null;\n\n #selected = false;\n\n #visible = false;\n\n constructor(eventBus, dateFormat, ltr, commentDialog) {\n this.#eventBus = eventBus;\n this.#dateFormat = dateFormat;\n this.#isLTR = ltr;\n this.#commentDialog = commentDialog;\n this.sidebar = null;\n }\n\n get _popupWidth() {\n const container = this.#createPopup();\n const { style } = container;\n style.opacity = \"0\";\n style.display = \"block\";\n document.body.append(container);\n const width = container.getBoundingClientRect().width;\n container.remove();\n style.opacity = style.display = \"\";\n return shadow(this, \"_popupWidth\", width);\n }\n\n #createPopup() {\n if (this.#container) {\n return this.#container;\n }\n const container = (this.#container = document.createElement(\"div\"));\n container.className = \"commentPopup\";\n container.id = \"commentPopup\";\n container.tabIndex = -1;\n container.role = \"dialog\";\n container.ariaModal = \"false\";\n container.addEventListener(\"contextmenu\", noContextMenu);\n container.addEventListener(\"keydown\", e => {\n if (e.key === \"Escape\") {\n this.toggle(this.#editor, true, false);\n this.#previousFocusedElement?.focus();\n stopEvent(e);\n }\n });\n container.addEventListener(\"click\", () => {\n container.focus();\n });\n\n const top = document.createElement(\"div\");\n top.className = \"commentPopupTop\";\n const time = (this.#time = document.createElement(\"time\"));\n time.className = \"commentPopupTime\";\n\n const buttons = (this.#buttonsContainer = document.createElement(\"div\"));\n buttons.className = \"commentPopupButtons\";\n const edit = document.createElement(\"button\");\n edit.classList.add(\"commentPopupEdit\", \"toolbarButton\");\n edit.tabIndex = 0;\n edit.setAttribute(\"data-l10n-id\", \"pdfjs-editor-edit-comment-popup-button\");\n edit.ariaHasPopup = \"dialog\";\n edit.ariaControlsElements = [this.#commentDialog];\n const editLabel = document.createElement(\"span\");\n editLabel.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-edit-comment-popup-button-label\"\n );\n edit.append(editLabel);\n edit.addEventListener(\"click\", () => {\n const editor = this.#editor;\n const height = parseFloat(getComputedStyle(this.#text).height);\n this.toggle(editor, /* isSelected */ true, /* visibility */ false);\n editor.editComment({\n height,\n });\n });\n edit.addEventListener(\"contextmenu\", noContextMenu);\n\n const del = document.createElement(\"button\");\n del.classList.add(\"commentPopupDelete\", \"toolbarButton\");\n del.tabIndex = 0;\n del.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-delete-comment-popup-button\"\n );\n const delLabel = document.createElement(\"span\");\n delLabel.setAttribute(\n \"data-l10n-id\",\n \"pdfjs-editor-delete-comment-popup-button-label\"\n );\n del.append(delLabel);\n del.addEventListener(\"click\", () => {\n this.#eventBus.dispatch(\"reporttelemetry\", {\n source: this,\n details: {\n type: \"comment\",\n data: {\n deleted: true,\n },\n },\n });\n this.#editor.comment = null;\n this.destroy();\n });\n del.addEventListener(\"contextmenu\", noContextMenu);\n buttons.append(edit, del);\n\n top.append(time, buttons);\n\n const separator = document.createElement(\"hr\");\n\n const text = (this.#text = document.createElement(\"div\"));\n text.className = \"commentPopupText\";\n container.append(top, separator, text);\n\n // Make the dialog draggable.\n let pointerMoveAC;\n const cancelDrag = () => {\n container.classList.remove(\"dragging\");\n pointerMoveAC?.abort();\n pointerMoveAC = null;\n };\n top.addEventListener(\"pointerdown\", e => {\n if (pointerMoveAC) {\n cancelDrag();\n return;\n }\n const { target, clientX, clientY } = e;\n if (buttons.contains(target)) {\n return;\n }\n stopEvent(e);\n const { width: parentWidth, height: parentHeight } =\n this.#editor.parentBoundingClientRect;\n this.#prevDragX = clientX;\n this.#prevDragY = clientY;\n pointerMoveAC = new AbortController();\n const { signal } = pointerMoveAC;\n container.classList.add(\"dragging\");\n window.addEventListener(\n \"pointermove\",\n ev => {\n if (!pointerMoveAC) {\n return; // Not dragging.\n }\n const { clientX: x, clientY: y } = ev;\n this.#setPosition(\n this.#posX + (x - this.#prevDragX) / parentWidth,\n this.#posY + (y - this.#prevDragY) / parentHeight,\n /* correctPosition = */ false\n );\n this.#prevDragX = x;\n this.#prevDragY = y;\n stopEvent(ev);\n },\n { signal }\n );\n window.addEventListener(\"blur\", cancelDrag, { signal });\n window.addEventListener(\n \"pointerup\",\n ev => {\n if (pointerMoveAC) {\n cancelDrag();\n stopEvent(ev);\n }\n },\n { signal }\n );\n });\n\n return container;\n }\n\n updateColor(editor) {\n if (this.#editor !== editor || !this.#visible) {\n return;\n }\n const { color, opacity } = editor.getData();\n this.#container.style.backgroundColor =\n (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n }\n\n _hide(editor) {\n const container = this.#createPopup();\n\n container.classList.toggle(\"hidden\", true);\n container.classList.toggle(\"selected\", false);\n (editor || this.#editor)?.setCommentButtonStates({\n selected: false,\n hasPopup: false,\n });\n this.#editor = null;\n this.#selected = false;\n this.#visible = false;\n this.#text.replaceChildren();\n this.sidebar.selectComment(null);\n }\n\n toggle(editor, isSelected, visibility = undefined, isEditable = true) {\n if (!editor) {\n this.destroy();\n return;\n }\n\n if (isSelected) {\n visibility ??=\n this.#editor === editor ? !this.#selected || !this.#visible : true;\n } else {\n if (this.#selected) {\n return;\n }\n visibility ??= !this.#visible;\n }\n\n if (!visibility) {\n this._hide(editor);\n return;\n }\n\n this.#visible = true;\n if (this.#editor !== editor) {\n this.#editor?.setCommentButtonStates({\n selected: false,\n hasPopup: false,\n });\n }\n\n const container = this.#createPopup();\n this.#buttonsContainer.classList.toggle(\"hidden\", !isEditable);\n container.classList.toggle(\"hidden\", false);\n container.classList.toggle(\"selected\", isSelected);\n this.#selected = isSelected;\n this.#editor = editor;\n editor.setCommentButtonStates({\n selected: isSelected,\n hasPopup: true,\n });\n\n const {\n contentsObj,\n richText,\n creationDate,\n modificationDate,\n color,\n opacity,\n } = editor.getData();\n container.style.backgroundColor =\n (color && CommentManager._makeCommentColor(color, opacity)) || \"\";\n this.#text.replaceChildren();\n const html =\n richText?.str && (!contentsObj?.str || richText.str === contentsObj.str)\n ? richText.html\n : contentsObj?.str;\n if (html) {\n renderRichText(\n {\n html,\n dir: contentsObj?.dir || \"auto\",\n className: \"richText\",\n },\n this.#text\n );\n }\n this.#time.textContent = this.#dateFormat.format(\n PDFDateString.toDateObject(modificationDate || creationDate)\n );\n this.#setPosition(\n ...editor.commentPopupPosition,\n /* correctPosition = */ editor.hasDefaultPopupPosition()\n );\n editor.elementBeforePopup.after(container);\n container.addEventListener(\n \"focus\",\n ({ relatedTarget }) => {\n this.#previousFocusedElement = relatedTarget;\n },\n { once: true }\n );\n if (isSelected) {\n setTimeout(() => container.focus(), 0);\n }\n }\n\n #setPosition(x, y, correctPosition) {\n if (!correctPosition) {\n this.#editor.commentPopupPosition = [x, y];\n } else {\n const widthRatio =\n this._popupWidth / this.#editor.parentBoundingClientRect.width;\n if (\n (this.#isLTR && x + widthRatio > 1) ||\n (!this.#isLTR && x - widthRatio >= 0)\n ) {\n const buttonWidth = this.#editor.commentButtonWidth;\n x -= widthRatio - buttonWidth;\n }\n }\n this.#posX = x;\n this.#posY = y;\n const { style } = this.#container;\n style.left = `${100 * x}%`;\n style.top = `${100 * y}%`;\n }\n\n destroy() {\n this._hide();\n this.#container?.remove();\n this.#container = this.#text = this.#time = null;\n this.#prevDragX = this.#prevDragY = Infinity;\n this.#posX = this.#posY = 0;\n this.#previousFocusedElement = null;\n }\n}\n\nexport { CommentManager };\n","/* Copyright 2013 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/** @typedef {import(\"./interfaces\").IDownloadManager} IDownloadManager */\n\nimport { createValidAbsoluteUrl, isPdfFile } from \"pdfjs-lib\";\n\nif (typeof PDFJSDev !== \"undefined\" && !PDFJSDev.test(\"CHROME || GENERIC\")) {\n throw new Error(\n 'Module \"pdfjs-web/download_manager\" shall not be used ' +\n \"outside CHROME and GENERIC builds.\"\n );\n}\n\nfunction download(blobUrl, filename) {\n const a = document.createElement(\"a\");\n if (!a.click) {\n throw new Error('DownloadManager: \"a.click()\" is not supported.');\n }\n a.href = blobUrl;\n a.target = \"_parent\";\n // Use a.download if available. This increases the likelihood that\n // the file is downloaded instead of opened by another PDF plugin.\n if (\"download\" in a) {\n a.download = filename;\n }\n // must be in the document for recent Firefox versions,\n // otherwise .click() is ignored.\n (document.body || document.documentElement).append(a);\n a.click();\n a.remove();\n}\n\n/**\n * @implements {IDownloadManager}\n */\nclass DownloadManager {\n #openBlobUrls = new WeakMap();\n\n downloadData(data, filename, contentType) {\n const blobUrl = URL.createObjectURL(\n new Blob([data], { type: contentType })\n );\n download(blobUrl, filename);\n }\n\n /**\n * @returns {boolean} Indicating if the data was opened.\n */\n openOrDownloadData(data, filename, dest = null) {\n const isPdfData = isPdfFile(filename);\n const contentType = isPdfData ? \"application/pdf\" : \"\";\n\n if (\n (typeof PDFJSDev === \"undefined\" || !PDFJSDev.test(\"COMPONENTS\")) &&\n isPdfData\n ) {\n let blobUrl = this.#openBlobUrls.get(data);\n if (!blobUrl) {\n blobUrl = URL.createObjectURL(new Blob([data], { type: contentType }));\n this.#openBlobUrls.set(data, blobUrl);\n }\n let viewerUrl;\n if (typeof PDFJSDev === \"undefined\" || PDFJSDev.test(\"GENERIC\")) {\n // The current URL is the viewer, let's use it and append the file.\n viewerUrl = \"?file=\" + encodeURIComponent(blobUrl + \"#\" + filename);\n } else if (PDFJSDev.test(\"CHROME\")) {\n // In the Chrome extension, the URL is rewritten using the history API\n // in viewer.js, so an absolute URL must be generated.\n viewerUrl =\n // eslint-disable-next-line no-undef\n chrome.runtime.getURL(\"/content/web/viewer.html\") +\n \"?file=\" +\n encodeURIComponent(blobUrl + \"#\" + filename);\n }\n if (dest) {\n viewerUrl += `#${escape(dest)}`;\n }\n\n try {\n window.open(viewerUrl);\n return true;\n } catch (ex) {\n console.error(\"openOrDownloadData:\", ex);\n // Release the `blobUrl`, since opening it failed, and fallback to\n // downloading the PDF file.\n URL.revokeObjectURL(blobUrl);\n this.#openBlobUrls.delete(data);\n }\n }\n\n this.downloadData(data, filename, contentType);\n return false;\n }\n\n download(data, url, filename) {\n let blobUrl;\n if (data) {\n blobUrl = URL.createObjectURL(\n new Blob([data], { type: \"application/pdf\" })\n );\n } else {\n if (!createValidAbsoluteUrl(url, \"http://example.com\")) {\n console.error(`download - not a valid URL: ${url}`);\n return;\n }\n blobUrl = url + \"#pdfjs.action=download\";\n }\n download(blobUrl, filename);\n }\n}\n\nexport { DownloadManager };\n","/* Copyright 2024 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\nimport { noContextMenu } from \"pdfjs-lib\";\n\nclass EditorUndoBar {\n #closeButton = null;\n\n #container;\n\n #eventBus = null;\n\n #focusTimeout = null;\n\n #initController = null;\n\n isOpen = false;\n\n #message;\n\n #showController = null;\n\n #undoButton;\n\n static #l10nMessages = Object.freeze({\n highlight: \"pdfjs-editor-undo-bar-message-highlight\",\n freetext: \"pdfjs-editor-undo-bar-message-freetext\",\n stamp: \"pdfjs-editor-undo-bar-message-stamp\",\n ink: \"pdfjs-editor-undo-bar-message-ink\",\n signature: \"pdfjs-editor-undo-bar-message-signature\",\n _multiple: \"pdfjs-editor-undo-bar-message-multiple\",\n });\n\n constructor({ container, message, undoButton, closeButton }, eventBus) {\n this.#container = container;\n this.#message = message;\n this.#undoButton = undoButton;\n this.#closeButton = closeButton;\n this.#eventBus = eventBus;\n }\n\n destroy() {\n this.#initController?.abort();\n this.#initController = null;\n\n this.hide();\n }\n\n show(undoAction, messageData) {\n if (!this.#initController) {\n this.#initController = new AbortController();\n const opts = { signal: this.#initController.signal };\n const boundHide = this.hide.bind(this);\n\n this.#container.addEventListener(\"contextmenu\", noContextMenu, opts);\n this.#closeButton.addEventListener(\"click\", boundHide, opts);\n this.#eventBus._on(\"beforeprint\", boundHide, opts);\n this.#eventBus._on(\"download\", boundHide, opts);\n }\n\n this.hide();\n\n if (typeof messageData === \"string\") {\n this.#message.setAttribute(\n \"data-l10n-id\",\n EditorUndoBar.#l10nMessages[messageData]\n );\n } else {\n this.#message.setAttribute(\n \"data-l10n-id\",\n EditorUndoBar.#l10nMessages._multiple\n );\n this.#message.setAttribute(\n \"data-l10n-args\",\n JSON.stringify({ count: messageData })\n );\n }\n this.isOpen = true;\n this.#container.hidden = false;\n\n this.#showController = new AbortController();\n\n this.#undoButton.addEventListener(\n \"click\",\n () => {\n undoAction();\n this.hide();\n },\n { signal: this.#showController.signal }\n );\n\n // Without the setTimeout, VoiceOver will read out the document title\n // instead of the popup label.\n this.#focusTimeout = setTimeout(() => {\n this.#container.focus();\n this.#focusTimeout = null;\n }, 100);\n }\n\n hide() {\n if (!this.isOpen) {\n return;\n }\n this.isOpen = false;\n this.#container.hidden = true;\n\n this.#showController?.abort();\n this.#showController = null;\n\n if (this.#focusTimeout) {\n clearTimeout(this.#focusTimeout);\n this.#focusTimeout = null;\n }\n }\n}\n\nexport { EditorUndoBar };\n","/* Copyright 2014 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\nclass OverlayManager {\n #overlays = new WeakMap();\n\n #active = null;\n\n get active() {\n return this.#active;\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @param {boolean} [canForceClose] - Indicates if opening the overlay closes\n * an active overlay. The default is `false`.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * registered.\n */\n async register(dialog, canForceClose = false) {\n if (typeof dialog !== \"object\") {\n throw new Error(\"Not enough parameters.\");\n } else if (this.#overlays.has(dialog)) {\n throw new Error(\"The overlay is already registered.\");\n }\n this.#overlays.set(dialog, { canForceClose });\n\n dialog.addEventListener(\"cancel\", ({ target }) => {\n if (this.#active === target) {\n this.#active = null;\n }\n });\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * opened.\n */\n async open(dialog) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (this.#active) {\n if (this.#active === dialog) {\n throw new Error(\"The overlay is already active.\");\n } else if (this.#overlays.get(dialog).canForceClose) {\n await this.close();\n } else {\n throw new Error(\"Another overlay is currently active.\");\n }\n }\n this.#active = dialog;\n dialog.showModal();\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async close(dialog = this.#active) {\n if (!this.#overlays.has(dialog)) {\n throw new Error(\"The overlay does not exist.\");\n } else if (!this.#active) {\n throw new Error(\"The overlay is currently not active.\");\n } else if (this.#active !== dialog) {\n throw new Error(\"Another overlay is currently active.\");\n }\n dialog.close();\n this.#active = null;\n }\n\n /**\n * @param {HTMLDialogElement} dialog - The overlay's DOM element.\n * @returns {Promise} A promise that is resolved when the overlay has been\n * closed.\n */\n async closeIfActive(dialog) {\n if (this.#active === dialog) {\n await this.close(dialog);\n }\n }\n}\n\nexport { OverlayManager };\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/** @typedef {import(\"./overlay_manager.js\").OverlayManager} OverlayManager */\n\nimport { PasswordResponses } from \"pdfjs-lib\";\n\n/**\n * @typedef {Object} PasswordPromptOptions\n * @property {HTMLDialogElement} dialog - The overlay's DOM element.\n * @property {HTMLParagraphElement} label - Label containing instructions for\n * entering the password.\n * @property {HTMLInputElement} input - Input field for entering the password.\n * @property {HTMLButtonElement} submitButton - Button for submitting the\n * password.\n * @property {HTMLButtonElement} cancelButton - Button for cancelling password\n * entry.\n */\n\nclass PasswordPrompt {\n #activeCapability = null;\n\n #updateCallback = null;\n\n #reason = null;\n\n /**\n * @param {PasswordPromptOptions} options\n * @param {OverlayManager} overlayManager - Manager for the viewer overlays.\n * @param {boolean} [isViewerEmbedded] - If the viewer is embedded, in e.g.\n * an